2009-07-30 43 views
35

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

#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 

是在Ç这样的事情可能吗?

回答

41

您可以在Visual Studio中打印出预处理器变量的值。以下输出_MSC_VER的值:

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

#pragma message(STRING(_MSC_VER)) 

不知道这是多么标准。

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”的含义。

+5

你的第二个点是不正确的 - C89取消该限制。 #必须是该行的第一个符号,但它可能以空格(而不是注释)开头。 – 2009-07-30 03:05:03

+0

谢谢。我无法相信我仍然生活在黑暗时代。你能指出我的相关文件吗? – 2009-07-30 03:09:53

+0

哇。我后来到比赛的时间比我想象的要多 - 我从来不知道这个限制。 – 2009-07-30 03:15:29

2

使用预处理程序标记粘贴操作:## TOKEN_NAME

正如前面提到的,您使用的是预处理器指令是非标准的,所以因人而异。

3

许多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 
8

这适用于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 
相关问题