Ответ 1
Я работаю над большим проектом, который включает в себя множество макропроцессоров препроцессора для синтеза любого кода, который нельзя заменить шаблонами. Поверьте, мне знакомы всевозможные шаблонные трюки, но пока нет стандартизованного, типа безопасный язык метапрограммирования, который может напрямую создавать код, нам придется придерживаться старого старого препроцессора и его громоздких макросов, чтобы решить некоторые проблемы, которые потребовалось бы написать в десять раз больше кода без. Некоторые макросы охватывают многие строки, и их очень трудно читать в предварительно обработанном коде. Поэтому я подумал о решении этой проблемы, и я пришел к следующему:
Скажем, у нас есть макрос C/С++, который охватывает несколько строк, например. в файле с именем MyMacro.hpp
// Content of MyMacro.hpp
#include "MultilineMacroDebugging.hpp"
#define PRINT_VARIABLE(S) \
__NL__ std::cout << #S << ": " << S << std::endl; \
__NL__ /* more lines if necessary */ \
__NL__ /* even more lines */
В каждом файле, где я определил такой макрос, я включаю еще один файл MultilineMacroDebugging.hpp, который содержит следующее:
// Content of MultilineMacroDebugging.hpp
#ifndef HAVE_MULTILINE_DEBUGGING
#define __NL__
#endif
Это определяет пустой макрос __NL__
, который заставляет определения __NL__
исчезать во время предварительной обработки. Затем макрос можно использовать где-нибудь, например.
в файле MyImplementation.cpp.
// Content of MyImplementation.cpp
// Uncomment the following line to enable macro debugging
//#define HAVE_MULTILINE_DEBUGGING
#include "MyMacro.hpp"
int a = 10;
PRINT_VARIABLE(a)
Если мне нужно отладить макрос PRINT_VARIABLE
, я просто раскомментирую строку, которая определяет макрос HAVE_MULTILINE_DEBUGGING
в MyImplementation.cpp. Полученный код, конечно, не компилируется, так как макрос __NL__
показывает результаты undefined, что заставляет его оставаться в скомпилированном коде, но его можно, однако, предварительно обработать.
Решающим шагом является замена строки __NL__
на выходе препроцессора с помощью новых строк, используя ваш любимый текстовый редактор, и, воала, вы получаете читаемое представление результата замененного макроса после предварительной обработки, которая точно напоминает то, что компилятор увидит, кроме искусственно введенных строк новой строки.