Как эффективно отлаживать макросы в VS?

У меня довольно сложный макрос внутри моего (неуправляемого) кода на С++. Есть ли способ расширить макросы в отладчике VS? Или, может быть, есть другой способ отладки макросов там?

F.e. Я хотел бы разместить в нем точку останова.

(Да, я знаю, что макросы плохие.)

Ответы

Ответ 1

Перейдите в свойства проекта или исходного файла, щелкнув правой кнопкой мыши и перейдя в "Свойства". В разделе "Свойства конфигурации" → "C/С++ → " Препроцессор "установите" Сгенерировать предварительно обработанный файл "как с номерами строк, так и без них, в зависимости от того, что вы предпочитаете. Это покажет, что ваш макрос расширяется в контексте. Если вам нужно отлаживать его на live-компилированном коде, просто вырезайте его и вставьте в него и поместите вместо своего макроса во время отладки.

Ответ 2

Компилятор красиво расширяет макросы. Получите список компиляции с расширенными макросами.

Вставьте расширенный макрос в свой код. Перекомпилируйте и вы сможете пройти через него, сделать простой тест.

Обычно, когда я создаю сложный макрос, Сначала я сначала скремлю его, и проверю. Затем я превращаю его в макрос.

В 2008 году этот может помочь

Ответ 3

Я узнал из http://www.codeproject.com/Tips/320721/Macro-expansion-in-VCplusplus лучший способ отладки макросов.

И я делаю, чтобы создать cxx файл с именем "test.cxx", а внутри я только поместить макрос, а какой-то пример использования test.cxx:

#define GetMacro(param1) \
  public: void Get##param1(){ return m_##param1; }

GetMacro(MyVariable);

и в командной строке я введите:

c:\ cl /EP test.cxx > output.cxx

Когда я открываю файл output.cxx, должны быть несколько пустых строк, а внизу - расширенный макрос, например:

public: void GetMyVariable(){ return m_MyVariable; };

Вы можете протестировать макросы без компиляции и сделать это быстро.

Ответ 4

Если вы хотите увидеть расширенный код, сгенерированный препроцессором, вы можете получить его с помощью флага -E с помощью gcc. Команда будет выглядеть так:

$ gcc -E <source code> -o <preprocessed file name>

Вы можете заменить исходный код с помощью макроса на расширенный код и поместить туда точку останова.

Ответ 5

Я слышал все возможные отрицательные ответы по теме:

  • макросы могут быть расширены без оценки
  • Препроцессор должен анализировать также файлы.
  • Вложенные макросы могут быть чрезмерно сложными
  • условная предварительная обработка может быть сложной
  • макросы - зло, просто избегайте их.
  • и т.д. и т.д.

Все они верны, но IMO они сталкиваются с реализацией каждодневного программирования.

Фактически, работая над старым проектом C, где макросы в основном просто использовались в качестве функций, для меня это имело решающее значение. Генерирование всех предварительно обработанных файлов с помощью /P работает, но является излишним и требует много времени. Мне просто нужен инструмент, который расширяет простой макрос, определенный несколькими строками выше или максимум в другом файле.

Как это сделать?

  • В Linux просто используйте GDB и его возможности расширения макросов.
  • В окнах я использую https://www.jetbrains.com/resharper-cpp/ интегрированный в Visual Studio

Итак, да, в практическом смысле это возможно.

Ответ 6

Встречайте зло с помощью метода eviler. Разверните один экземпляр макроса вручную, пока вы не закончите отладку, или утилита cpp не поможет вам развернуть все макросы, но я не уверен, есть ли в ней версия Windows.

Ответ 7

Я сказал, что макросы очень сложны? Я хотел бы расширить только один или два слоя, не все макросы (в противном случае это явно нечитаемо)... при отладке

Если не слишком много макросов, которые вы не хотите расширять, вы можете просто #undef их перед фрагментом, который хотите отлаживать. Затем скомпилируйте с помощью [Generate Preprocessed File], как указано выше. Компиляция завершится неудачно, но вы получите полезную информацию, полученную на предварительно обработанном выходе, с правильными расширениями. Скопируйте-вставьте, удалите # undef-s и отлаживайте.

К сожалению, ваши лучшие друзья для работы с макросами C-стиля: встроенный, шаблон и хороший оптимизирующий компилятор.

Ответ 8

Используйте встроенные функции (принудительно вставляйте, если вы действительно это понимаете) и придерживайтесь этого! Это будет более эффективным (получить только встроенный, если он приносит производительность, если вы оптимизируете для перфоманса) и поддерживаемым. Вы много теряете, используя макросы: проверка типов и безопасность.

Макросы не существуют для компилятора, они предназначены только для препроцессора. Это делает замену текста без поиска побочных эффектов. Таким образом, макросы на самом деле никогда не вызываются, и вы не можете отлаживать их. Независимо от того, как вы кодируете макрос, злоупотребление всегда возможно. Как в этом примере:

#define SQUARE(a) ((a)*(a))

Обратите внимание на ( `) 'для защиты от замен, таких как SQUARE (3 + 2). Но они не защищают против:

int a = 1;
int b = SQUARE(++a);

Можно было бы ожидать, что это будет 4, но в итоге вы получите 6, который не является квадратным. Поскольку он расширяется до int b = (++a)*(++a); У вас не будет этой проблемы с встроенными функциями.

Обратите внимание, что реализация встроенной функции должна быть видимой для компилятора в тех местах, где вы его используете. Также отладка будет странной для начинающего пользователя: поскольку есть много примеров встроенной функции, вы получите огромный список методов, если хотите переместить точку выполнения в другое место, например.

Ответ 9

Да, вы можете.

Найдите предварительно обработанный файл, сгенерированный препроцессором в папке Debug.

Итак, если ваш макрос написан в файле test.c, предварительно обработанный файл будет называться testing.i

Здесь вы можете увидеть, как макрос был расширен.

Чтобы отладить его, просто скопируйте этот код в свой::)