通过pragma消息打印基于其他宏的定义的数值?

时间:2015-09-04 01:55:10

标签: c++ macros c-preprocessor pragma

这类似于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打印基于其他宏的定义的数值?

1 个答案:

答案 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