| <!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>Щелкните макрос правой кнопкой мыши и выберите команды "Navigate" ->"View Macro Expansion" из всплывающего меню.<br> Откроется окно "Macro Expansion" для отображения развернутого кода макроса в контексте кода, вызывающего этот макрос.</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> |
| В окне "Macro Expansions" содержимое макросов находится в защищенных блоках. В развернутом коде присутствует семантическая подсветка. Гиперссылки в окне 'Расширение макроса' можно использовать для перехода к другим исходным файлам. Также в представлении выделены случаи использования параметров макроса. |
| </p> |
| <p> |
| В левом столбце окна "Macro Expansion" содержатся следующие кнопки панели инструментов:</p> |
| <ul> |
| <li>Синхронизировать знак вставки, содержимое и контекст<br> С помощью этого параметра можно синхронизировать позицию знака вставки и содержимого в исходном файле в окне редактора и в окне 'Расширение макроса'.<br> Он также изменяет контекст таким образом, чтобы он был актуален для позиции знака вставки (только при выборе параметра "Expand local context only"). |
| </li><li>Expand local context only. В окне "Macro Expansion" развертываются только макросы, расположенные в блоке кода, в котором находится точка вставки. |
| </li> |
| <li>Expand whole file<br> В окне "Macro Expansion" развертываются все макросы файла исходного кода. |
| </li> |
| <li>Стрелки вверх и вниз<br> Эти кнопки используются для быстрого перехода к следующему или предыдущему макросу.</li> |
| </ul> |
| |
| <h2><a name="debug"></a> Отладка кода, в котором используются макросы</h2> |
| <p> |
| Иногда одного лишь понимания значения макроса недостаточно.<br> Например, вы выполняете отладку следующего кода: |
| </p> |
| <pre>#include <stdlib.h> |
| #include <iostream> |
| |
| #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 << "last person"; |
| } |
| return (EXIT_SUCCESS); |
| } |
| </pre> |
| <p> |
| Допустим, что отладчик был остановлен на операторе <tt>if</tt> и необходимо узнать, будет ли программа выводить текст 'last person'. |
| </p> |
| <p> |
| Во всплывающей подсказке представления "Macro expansion" указано, что значение<tt>ID_FRINDS_NUMBER</tt> равно "<tt>(((((0))+ 1)+ 1)+ 1)</tt>".<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> |