Вывести числовое значение определения, основанного на других макросах, через прагматическое сообщение?

Это похоже на Как мне показать значение #define во время компиляции?, Ответ Криса Барри не работает для меня:

#ifdef __GNUC__
    #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif
...

#define XSTR(x) STR(x)
#define STR(x) #x
#pragma message "The value of GCC_VERSION: " XSTR(GCC_VERSION)

Результаты в:

$ rm -f dlltest.o && make dlltest.o
g++ -DNDEBUG -g2 -O2 -march=native -pipe -c dlltest.cpp
dlltest.cpp:13:80: note: #pragma message: The value of GCC_VERSION: (4 * 10000 + 9 * 100 + 3)
 #pragma message "The value of GCC_VERSION: " XSTR(GCC_VERSION)
                                                                                ^
dlltest.cpp:12:17: note: in definition of macro ‘STR’
 #define STR(x) #x
                 ^
dlltest.cpp:13:55: note: in expansion of macro ‘XSTR’
 #pragma message "The value of GCC_VERSION: " XSTR(GCC_VERSION)

Как можно видеть выше, числовое значение не было напечатано. Кроме того, было напечатано много лишних бесполезных кормов.

Как я могу заставить GCC распечатать числовое значение определения, основанного на других макросах?

1 ответ

Препроцессор не выполняет арифметических подстановок. (В #if, он может вычислить истинный / ложный результат, но, к сожалению, это единственное место, где препроцессор выполняет вычисления.)

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

Так что вам лучше использовать конкатенацию строк, чем арифметику.

#pragma message "GCC version: " XSTR(__GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__)

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

#define STR(x) #x
#define XSTR(x) STR(x)
#define MSG(x) _Pragma (STR(message (x)))
#define DISPLAY_GCC_VERSION \
  MSG("GCC version: " XSTR(__GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__))

DISPLAY_GCC_VERSION
Другие вопросы по тегам