Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以用C打印预处理器变量吗?_C_Variables_C Preprocessor - Fatal编程技术网

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

可以用C打印预处理器变量吗?,c,variables,c-preprocessor,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中是否可能出现类似的情况?嗯,您所做的实际上是非标准的。首先,“警告”或“

是否可以将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中是否可能出现类似的情况?

嗯,您所做的实际上是非标准的。首先,“警告”或“警告”指令不是标准指令。其次,使用预处理器时,行必须以磅符号开头,不带空格:

#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 #ifdef BLAH1 #定义BLAH2//OK,因为pound在最左边。 #恩迪夫 #ifdef BLAH3 #define BLAH4//适用于许多编译器,但它是非标准的。 #恩迪夫
由于您已经在使用非标准扩展,您将需要查找正在使用的特定预处理器/编译器的文档,以查看它对“警告”的说明。

使用预处理器令牌粘贴操作符:##令牌_NAME


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

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

可以在visual studio下打印预处理器变量的值。下面打印出_MSC\u VER的值:

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

#pragma message(STRING(_MSC_VER))

但不确定这是多么标准。

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

您的第二点不正确-C89取消了该限制。#必须是行中的第一个符号,但前面可以有空格(但不能有注释)。谢谢。我不敢相信我还生活在黑暗时代。你能给我指一下相关的文件吗?哇。我参加游戏的时间比我想象的要晚——我根本不知道这个限制。@Jonathan:在任何预处理指令前面加上注释(至少c comment/*..*/)是完全没有问题的,它将在翻译阶段#3被单空格替换。预处理指令在第4阶段处理,因此不受前面的c注释的影响。@Artur:你说得对-但在糟糕的过去(真正的过去,C89标准之前),注释是不允许的。我的错误。(请注意,在预处理器指令之前包含注释必须有非常非常好的理由,我想不出任何理由。)所以当你说“很难看到变量的值”时,你真正的意思是你看不到它;我还没有想出一个办法去看它,这和“没有办法看它”是不一样的。我想这就是我想做的。。。。我想知道运行库将什么定义为字符串(比如
0
INT\u MAX
LONG\u MAX
),但是stringy只返回
SSIZE\u MAX
(定义的左侧)。它不是标准的,而是GCC、MSVC、CLANG。。。(可能其他人也支持)VisualStudio显然not@derHugo:很抱歉,我刚刚使用Visual Studio 2017和C++17进行了测试,这项工作没有问题。我使用自定义预处理器变量进行了测试,而不是使用_MSC\u VER!