是否可以在C中打印预处理器变量?

时间:2009-07-30 02:54:33

标签: c variables c-preprocessor

是否可以在 C 中打印到stderr预处理器变量的值?例如,我现在拥有的是:

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR is greater than 10
#endif

但我想做的是:

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR=%PP_VAR%
#endif

C 中是否可以这样?

5 个答案:

答案 0 :(得分:48)

您可以在visual studio下打印出预处理器变量的值。以下打印出_MSC_VER的值:

#define STRING2(x) #x
#define STRING(x) STRING2(x)

#pragma message(STRING(_MSC_VER))

不确定这是多么标准。

答案 1 :(得分:10)

这适用于GCC 4.4.3:

#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)

的产率:

src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017

答案 2 :(得分:4)

许多C编译器支持#warning(但它没有被C标准定义)。

但是,GCC至少不会对后面的数据进行预处理,这意味着很难看到变量的值。

#define PP_VAR 123
#warning "Value of PP_VAR = " PP_VAR
#warning "Value of PP_VAR = " #PP_VAR
#warning "Value of PP_VAR = " ##PP_VAR

GCC产生:

x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR

答案 3 :(得分:2)

使用预处理程序令牌粘贴操作符:## TOKEN_NAME

如前所述,您使用的预处理程序指令是非标准的,因此YMMV。

答案 4 :(得分:0)

嗯,你在做什么实际上是非标准的。首先,“#warning”或“#warn”指令不是标准的。其次,在使用预处理器时,该行必须以井号开头,不带任何空格:

#ifdef BLAH1
#    define BLAH2 // OK, because pound is at the very left.
#endif

#ifdef BLAH3
     #define BLAH4 // Works on many compilers, but is non-standard.
#endif

由于您已经在使用非标准扩展,因此您需要查找正在使用的特定预处理器/编译器的文档,以查看它所说的“#warning”。