В предыдущих версиях среды IDE NetBeans макросы имели вид гиперссылок. Разработчик мог щелкнуть макрос кнопкой мыши для просмотра его развернутого кода, что вызывало открытие в среде IDE файла заголовка, в котором был определен макрос. Это неудобно для простых макросов (например, числовых констант или строковых литералов) в тех случаях, когда разработчику необходимо просто ознакомиться с их определением.
Среда IDE NetBeans 6.7 включает в себя две новые возможности для просмотра исходного кода, содержащего макросы:
Всплывающие подсказки для макросов (используется для коротких и простых макросов)
Развернутое представление макроса (используется для более сложных макросов)
Работа с простыми макросами с использованием всплывающих подсказок для макросов
С помощью всплывающих подсказок для макросов можно просмотреть всплывающее окно без открытия другого файла.
Для активации всплывающей подсказки макроса и просмотра его развернутого кода необходимо выполнить следующие действия:
Нажмите Ctrl+Alt.
Установите курсор мыши на требуемый макрос. Откроется всплывающая подсказка для отображения развернутой информации.
Для получения дополнительных сведений щелкните макрос, одновременно удерживая клавиши Ctrl+Alt. Откроется окно "Macro Expansion", в котором отображается функция с представлением развернутого кода.
Работа со сложными макросами с использованием представления "Macro Expansion"
Представление "Macro Expansion" позволяет просматривать исходный код со сложными макросами, состоящими из нескольких строк. Макросы в основном служат для определения констант, а также могут применяться для определения фрагментов кода, применяемых в качестве функций. При работе с кодом, в котором макросы используются подобным образом, может быть сложно понять то, какие процессы происходят в коде. Возможно, потребуется просмотр макроса в контексте исходного кода, вызывающего макрос.
Для просмотра исходного кода с развернутым кодом макроса:
Щелкните макрос правой кнопкой мыши и выберите команды "Navigate" ->"View Macro Expansion" из всплывающего меню.
Откроется окно "Macro Expansion" для отображения развернутого кода макроса в контексте кода, вызывающего этот макрос.
Также можно навести курсор мыши на интересующий код, при этом удерживая Ctrl+Alt, и щелкнуть гиперссылку.
В окне "Macro Expansions" содержимое макросов находится в защищенных блоках. В развернутом коде присутствует семантическая подсветка. Гиперссылки на представление "Macro Expansion" можно использовать для перехода к другим файлам исходного кода. Также в представлении выделены случаи использования параметров макроса.
В левом столбце окна "Macro Expansion" содержатся следующие кнопки панели инструментов:
Synchronize caret, content and context
С помощью этого параметра выполняется синхронизация позиции знака вставки и содержимого в файле исходного кода в окне "Editor" и в представлении "Macro Expansion".
Он также изменяет контекст таким образом, чтобы он был релевантен для позиции знака вставки (только при выборе параметра "Expand local context only").
Expand local context only. В окне "Macro Expansion" развертываются только макросы, расположенные в блоке кода, в котором находится точка вставки.
Expand whole file
В окне "Macro Expansion" развертываются все макросы файла исходного кода.
Стрелки вверх и вниз
Эти кнопки используются для быстрого перехода к следующему или предыдущему макросу.
Отладка кода, в котором используются макросы
Не всегда достаточно понимать значение макроса.
Рассмотрим простой пример:
#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);
}
Представьте, что отладчик был остановлен на операторе if, а нам необходимо узнать, будет ли программа печатать текст "last person".
Во всплывающей подсказке представления "Macro expansion" указано, что значениеID_FRINDS_NUMBER равно "(((((0))+ 1)+ 1)+ 1)".
Однако непонятно, насколько велико это число. В этой простой ситуации легко ответить, что это число равно "3", но число людей могло равняться двум тысячам.
Оценка макросов с помощью всплывающих подсказок
Теперь можно использовать анализ выражений и с помощью макросов.
Наведите курсор мыши на элемент ID_FRINDS_NUMBER. Будет отображено следующее:
Также можно выполнить оценку всего выражения:
Соблюдайте осторожность при оценке макросов во всплывающих подсказках, так как подобный анализ может изменять состояние программы. Например, при оценке макроса, развернутый код которого равен i++, выполняется увеличение i;
Использование окна "Watches" для оценки макросов
Теперь макросы можно использовать в окне отладчика "Watches":
Соблюдайте осторожность при оценке макросов в окне "Watches", так как подобный анализ может изменить состояние программы. Например, при оценке макроса, развернутый код которого равен i++, выполняется увеличение i;