是否可以将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里有这种可能吗?
pdtvr36n1#
你可以在visual studio下打印出预处理器变量的值。下面的代码打印出_MSC_VER的值:
#define STRING2(x) #x #define STRING(x) STRING2(x) #pragma message(STRING(_MSC_VER))
字符串我不知道这有多标准。
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
型
fcg9iug33#
许多C编译器支持#warning,但它不是由C标准定义的,除非你使用C23或更高版本。然而,GCC至少不会对后面的数据进行预处理,这意味着很难看到变量的值。
#warning
#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标准预计会说:
语义
任一形式的预处理指令
# error pp-tokensopt new-line # warning pp-tokensopt new-line
型使实现产生一个诊断消息,其中包括指定的预处理标记序列。由于它指定诊断消息包括预处理令牌,因此不会在#error或#warning的消息中扩展宏。指定#error的标准中没有一个明确指定如果执行该指令,翻译单元的编译应该失败-只会产生诊断。然而,如果执行#error指令,TU应该无法编译,这是合理的预期。2相反,执行#warning指令不应该导致TU编译失败。
#error
m528fe3b4#
使用预处理器标记粘贴操作符:##TOKEN_NAME如前所述,您正在使用的预处理器指令是非标准的,因此使用YMMV。
yqkkidmi5#
好吧,你所做的实际上是不标准的。首先,#warning或#warn指令是不标准的。其次,当使用预处理器时,行必须开始与磅符号,没有任何空格:
#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有什么说明。
5条答案
按热度按时间pdtvr36n1#
你可以在visual studio下打印出预处理器变量的值。下面的代码打印出_MSC_VER的值:
字符串
我不知道这有多标准。
cnwbcb6i2#
这适用于GCC 4.4.3:
字符串
产量:
型
fcg9iug33#
许多C编译器支持
#warning
,但它不是由C标准定义的,除非你使用C23或更高版本。然而,GCC至少不会对后面的数据进行预处理,这意味着很难看到变量的值。
字符串
GCC生产:
型
C23标准预计会说:
§6.10.6诊断指令
语义
任一形式的预处理指令
型
使实现产生一个诊断消息,其中包括指定的预处理标记序列。
由于它指定诊断消息包括预处理令牌,因此不会在
#error
或#warning
的消息中扩展宏。指定#error
的标准中没有一个明确指定如果执行该指令,翻译单元的编译应该失败-只会产生诊断。然而,如果执行#error
指令,TU应该无法编译,这是合理的预期。2相反,执行#warning
指令不应该导致TU编译失败。m528fe3b4#
使用预处理器标记粘贴操作符:##TOKEN_NAME
如前所述,您正在使用的预处理器指令是非标准的,因此使用YMMV。
yqkkidmi5#
好吧,你所做的实际上是不标准的。首先,
#warning
或#warn
指令是不标准的。其次,当使用预处理器时,行必须开始与磅符号,没有任何空格:字符串
由于你已经在使用一个非标准的扩展,你需要查找你正在使用的特定预处理器/编译器的文档,看看它对
#warning
有什么说明。