【问题标题】:How to test C Preprocessor -D flag value?如何测试 C 预处理器 -D 标志值?
【发布时间】:2021-02-18 01:06:50
【问题描述】:

我有以下 .c 文件:

$ cat hellomake.c 
#include <stdio.h>

#ifdef REVISION
#warning defined
#else
#warning not defined
#endif

#if REVISION==C0
#warning using C0
char str[] = "c0";
#else
#warning using B0
char str[] = "b0";
#endif

void main(void)
{
    printf("%s\n", str);
}

我使用这个 Makefile 构建它:

$cat Makefile 
REVISION=B0

all: hellomake.c
    gcc -o hellomake hellomake.c -DREVISION=$(REVISION)

Build 显示预处理器通过 #if REVISION==C0 分支,而不是通过 #else 分支:

$ make all
gcc -o hellomake hellomake.c -DREVISION=B0
hellomake.c:4:2: warning: #warning defined [-Wcpp]
    4 | #warning defined
      |  ^~~~~~~
hellomake.c:10:2: warning: #warning using C0 [-Wcpp]
   10 | #warning using C0
      |  ^~~~~~~

执行二进制文件也显示了相同的奇怪行为:

$ ./hellomake 
c0

我的问题是,这怎么可能?为什么#if REVISION==C0 值测试不能正常工作?我期待预处理器打印“使用 B0”,二进制执行结果是“b0”。

【问题讨论】:

    标签: c preprocessor


    【解决方案1】:

    C 预处理器不进行字符串比较。相反,B0C0 被解释为未定义的宏标识符,值为 0。因此,当 REVISION==C0 扩展为 B0==C0 时,这将变为 0==0,这是真的。如果您想要可比较的东西,则需要使用整数。见:https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_4.html#SEC38

    【讨论】:

    • 一种解决方法是使用不同的数值定义宏 C0B0
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 2012-07-27
    • 2010-11-08
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多