blob: 63509176f6d757baf4334f99460c746504376569 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="author" content="Nikolay.Krasilnikov@oracle.com">
<meta name="description" content="A short guide to macro features in C/C++ projects in
NetBeans IDE or Oracle Solaris Studio IDE.">
<meta name="keywords" content="NetBeans, IDE, macros,
tutorial, guide, user, documentation, open source, C, C++, make, dbx, gdb">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<title>Обзор макросов в проектах C/C++ - Практическое руководство по IDE NetBeans</title>
</head>
<body style="padding: 2px;">
<h1>Обзор макросов в проектах C/C++ - Практическое руководство по IDE NetBeans</h1>
<div class="articledate" style="margin-left: 0px;font-style:italic;">
<p><em>Составитель: <a href="mailto:Nikolay.Krasilnikov@oracle.com"><i>Николай Красильников</i></a> <br> Октябрь 2013</em> [Номер редакции: V7.4-1]</div>
<p>В этом практическом руководстве описывается использование новых функций IDE NetBeans для инспектирования и отладки кода, включающего в себя макросы.</p>
<p><b>Содержание</b></p>
<img alt="Содержимое на этой странице применимо к IDE NetBeans 7.3 и 7.4" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-74-73.png" title="Содержимое этой страницы применимо к IDE NetBeans 7.3 и 7.4">
<ul class="toc">
<li><a href="#requirements">Требования</a></li>
<li><a href="#investigate">Изучение кода, в котором используются макросы</a></li>
<li><a href="#debug">Отладка кода, в котором используются макросы</a></li>
</ul>
<h2><a name="requirements"></a>Требования</h2>
<p><b>Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.</b> </p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Программное обеспечение или материал</th>
<th class="tblheader" scope="col">Требуемая версия</th>
</tr>
<tr>
<td class="tbltd1">IDE NetBeans</td>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">версия 7.3 или 7.4 с подключаемым модулем NetBeans C/C++</a></td>
</tr>
<tr>
<td class="tbltd1">Комплект для разработчика на языке Java (JDK)</td>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">версия 6 или 7</a></td>
</tr>
</table>
<p>Дополнительные сведения о загрузке и установке необходимого программного обеспечения см. в разделах <a href="../../../community/releases/74/install.html">Инструкции по установке IDE NetBeans</a> и <a HREF="../../../community/releases/74/cpp-setup-instructions.html">Настройка IDE NetBeans для C/C++/Fortran</a><br>.
</p>
<h2><a name="investigate"></a>Изучение кода, в котором используются макросы</h2>
<p>Макросы содержат гиперссылки. Если нажать на ссылку, удерживая клавишу Ctrl, в IDE откроется файл заголовка, в котором определен данный макрос. Однако зачастую при работе с простыми макросами (например, числовыми константами или строковыми литералами) требуется ознакомиться только с определением макроса.</p>
<p>
В IDE NetBeans реализованы две функции для быстрого просмотра исходного кода, содержащего макросы:</p>
<ul>
<li>Всплывающие подсказки для макросов (используется для коротких и простых макросов)</li>
<li>Окно 'Расширение макроса' (используется для более сложных макросов)</li>
</ul>
<h3><a name="tooltips"></a>Работа с простыми макросами с использованием всплывающих подсказок для макросов</h3>
<p>С помощью всплывающих подсказок для макросов можно просмотреть всплывающее окно без открытия другого файла.
</p>
<p><b>Для активации всплывающей подсказки макроса и просмотра его развернутого кода необходимо выполнить следующие действия:</b></p>
<ol><li>Нажмите и удерживайте сочетание клавиш Ctrl+Alt.</li>
<li>Установите курсор мыши на макрос, который вы хотите развернуть. Отобразится всплывающая подсказка с развернутой информацией, как показано на рисунке.</li>
</ol>
<P><img SRC="../../../images_www/articles/73/cnd/macros/macro-tooltip.png" alt="Расширение подсказок макроса" class="b-all margin-around"></P>
<h3>Работа со сложными макросами в окне 'Расширение макроса'</h3>
<p>
В представлении 'Расширение макроса' можно просматривать исходный код со сложными макросами, состоящими из нескольких строк. Макросы в основном служат для определения констант, а также могут применяться для определения фрагментов кода, применяемых в качестве функций. При работе с кодом, в котором макросы используются подобным образом, может быть сложно понять то, какие процессы происходят в коде. Возможно, потребуется просмотр макроса в контексте исходного кода, вызывающего макрос.
</p>
<p><b>Для просмотра исходного кода с развернутым кодом макроса выполните следующие действия:</b></p>
<ul>
<li>Щелкните макрос правой кнопкой мыши и выберите команды &quot;Navigate&quot; -&gt;&quot;View Macro Expansion&quot; из всплывающего меню.<br> Откроется окно &quot;Macro Expansion&quot; для отображения развернутого кода макроса в контексте кода, вызывающего этот макрос.</li>
<li>Также можно навести курсор мыши на нужный код, удерживая клавиши CTRL+ALT, и нажать на гиперссылку. В результате откроется окно 'Расширение макроса'.</li>
</ul>
<p>На приведенном ниже рисунке показано окно 'Расширение макроса'.</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-expansion.png" alt="Представление расширения макроса" class="b-all margin-around">
</p>
<p>
В окне &quot;Macro Expansions&quot; содержимое макросов находится в защищенных блоках. В развернутом коде присутствует семантическая подсветка. Гиперссылки в окне 'Расширение макроса' можно использовать для перехода к другим исходным файлам. Также в представлении выделены случаи использования параметров макроса.
</p>
<p>
В левом столбце окна &quot;Macro Expansion&quot; содержатся следующие кнопки панели инструментов:</p>
<ul>
<li>Синхронизировать знак вставки, содержимое и контекст<br> С помощью этого параметра можно синхронизировать позицию знака вставки и содержимого в исходном файле в окне редактора и в окне 'Расширение макроса'.<br> Он также изменяет контекст таким образом, чтобы он был актуален для позиции знака вставки (только при выборе параметра &quot;Expand local context only&quot;).
</li><li>Expand local context only. В окне &quot;Macro Expansion&quot; развертываются только макросы, расположенные в блоке кода, в котором находится точка вставки.
</li>
<li>Expand whole file<br> В окне &quot;Macro Expansion&quot; развертываются все макросы файла исходного кода.
</li>
<li>Стрелки вверх и вниз<br> Эти кнопки используются для быстрого перехода к следующему или предыдущему макросу.</li>
</ul>
<h2><a name="debug"></a> Отладка кода, в котором используются макросы</h2>
<p>
Иногда одного лишь понимания значения макроса недостаточно.<br> Например, вы выполняете отладку следующего кода:
</p>
<pre>#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;
#define ID_FIRST (0)
#define ID_ALICE (ID_FIRST)
#define ID_BOB (ID_ALICE + 1)
#define ID_TOM (ID_BOB + 1)
#define ID_FRINDS_NUMBER (ID_TOM + 1)
#define NEXT_PERSON(id) (id + 1)
#define PREV_PERSON(id) (id - 1)
using namespace std;
/*
* Main function
*/
int main(int argc, char** argv) {
int person = ID_TOM;
if (NEXT_PERSON(person) == ID_FRINDS_NUMBER) {
cout &lt;&lt; "last person";
}
return (EXIT_SUCCESS);
}
</pre>
<p>
Допустим, что отладчик был остановлен на операторе <tt>if</tt> и необходимо узнать, будет ли программа выводить текст 'last person'.
</p>
<p>
Во всплывающей подсказке представления &quot;Macro expansion&quot; указано, что значение<tt>ID_FRINDS_NUMBER</tt> равно &quot;<tt>(((((0))+ 1)+ 1)+ 1)</tt>&quot;.<br> Какое число скрывается за <tt>ID_FRINDS_NUMBER</tt>? В этой простой ситуации легко ответить, что значение <tt>ID_FRINDS_NUMBER</tt> равно 3, но если бы у нас было 2000 человек, все было бы гораздо сложнее.
</p>
<p>В этом случае можно было бы оценить выражение в макросе при отладке, как описано ниже.</p>
<h3>Оценка макросов с помощью всплывающих подсказок</h3>
<p>
В отладчике можно использовать оценку выражений в выражениях с макросами.<br> Наведите указатель мыши на элемент <tt>ID_FRINDS_NUMBER</tt>, и на экране появится информация, аналогичная информации на приведенной ниже иллюстрации:<br>
</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-debugging-expression-evaluation.png" alt="Вычисление выражений макроса" class="b-all margin-around">
</p>
<p>
Также можно выбрать все выражение и навести на него указатель мыши, чтобы оценка выражения отобразилась во всплывающей подсказке, как показано на рисунке:<br>
</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-debugging-expression-evaluation-2.png" alt="Вычисление выражений макроса" class="b-all margin-around">
</p>
<p class="tips">
Будьте внимательны при оценке макросов с помощью всплывающих подсказов, так как эта оценка может изменить состояние программы. Например, при оценке макроса, для которого развернутый код равен <tt>i++</tt>, значение <tt>i</tt> будет увеличено на 1.
</p>
<h3>Использование точек наблюдения при оценке макросов</h3>
<p>
Макросы можно использовать в точках наблюдения отладчика, как показано на рисунке:<br>
</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-debugging-watches.png" alt="Наблюдения за отладкой макроса" class="b-all margin-around">
</p>
<p class="tips">
Будьте внимательны при оценке макросов с помощью точек наблюдения, так как эта оценка может изменить состояние программы. Например, при оценке макроса, для которого развернутый код равен <tt>i++</tt>, значение <tt>i</tt> будет увеличено на 1.
</p>
<h2>См. также</h2>
<p>Дополнительные статьи о разработке с помощью C/C++/Fortran в IDE NetBeans см. в разделе <a href="https://netbeans.org/kb/trails/cnd.html">Учебные карты C/C++</a>.</p>
<div class="feedback-box"><a href="mailto:users@cnd.netbeans.org?subject=Feedback:%20Exploring%20Macros%20in%20C/C++%20Projects%20-%20NetBeans%20IDE%207.4%20Tutorial">Отправить отзыв по этому учебному курсу</a></div>
</body>
</html>