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

zz2j4svz  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(78)

是否可以将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里有这种可能吗?

pdtvr36n

pdtvr36n1#

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

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

#pragma message(STRING(_MSC_VER))

字符串
我不知道这有多标准。

cnwbcb6i

cnwbcb6i2#

这适用于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

fcg9iug3

fcg9iug33#

许多C编译器支持#warning,但它不是由C标准定义的,除非你使用C23或更高版本。
然而,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


C23标准预计会说:

§6.10.6诊断指令

语义

任一形式的预处理指令

# error pp-tokensopt new-line
# warning pp-tokensopt new-line


使实现产生一个诊断消息,其中包括指定的预处理标记序列。
由于它指定诊断消息包括预处理令牌,因此不会在#error#warning的消息中扩展宏。指定#error的标准中没有一个明确指定如果执行该指令,翻译单元的编译应该失败-只会产生诊断。然而,如果执行#error指令,TU应该无法编译,这是合理的预期。2相反,执行#warning指令不应该导致TU编译失败。

m528fe3b

m528fe3b4#

使用预处理器标记粘贴操作符:##TOKEN_NAME
如前所述,您正在使用的预处理器指令是非标准的,因此使用YMMV。

yqkkidmi

yqkkidmi5#

好吧,你所做的实际上是不标准的。首先,#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有什么说明。

相关问题