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

问题描述 投票:0回答:5

是否可以将 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 variables c-preprocessor
5个回答
67
投票

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

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

#pragma message(STRING(_MSC_VER))

但不确定这有多标准。


23
投票

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

6
投票

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

海湾合作委员会生产:

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 应该无法编译。相比之下,执行
#warning
指令不应导致 TU 编译失败。


3
投票

使用预处理器标记粘贴运算符:##TOKEN_NAME

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


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

© www.soinside.com 2019 - 2024. All rights reserved.