c - 如何测试 C 预处理器 -D 标志值?
问题描述
我有以下 .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 预处理器不进行字符串比较。相反,B0
andC0
被解释为未定义的宏标识符,值为 0。因此,何时REVISION==C0
扩展为B0==C0
this 成为0==0
true。如果您想要可比较的东西,则需要使用整数。见:https ://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_4.html#SEC38
推荐阅读
- python - server_socket.bind(sa) 失败
- r - 为什么我不能在分组数据 r 上创建汇总统计?
- vue.js - 使用 Jest 和 vue-utils 测试 Vue 组件
- python - 使用pandas合并excel文件数据
- react-native - 反应原生。滚动到 ScrollView 内的元素的最佳方式
- c# - Dynamics 365 Online - v9 更新后从外部批次更新机会时出错
- python - 无法弄清楚这段代码有什么问题[python 3x]
- sql-server - SQL:管理表中的更改日志
- python - Beautifullsoup:如何获取标签中的内容
?
- kubernetes - 如何使用 client-go 向 Kubernetes API 提交通用“runtime.Object”