这类似于How do I show the value of a #define at compile-time?。 Chris Barry的回答对我不起作用:
#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打印基于其他宏的定义的数值?
答案 0 :(得分:2)
预处理器不进行算术替换。 (在#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