预处理器#if相等指令未按预期工作求助
为什么编译触发
NODE错误而非预期的GATEWAY错误? 我定义了DEVICE_TYPE为GATEWAY,但编译时却触发了NODE的#error,而非预期的GATEWAY错误,相关代码及编译信息如下:
root@GATEWAY-0x0000001E:~/gateway/experiments# cat compile_define.cpp #define DEVICE_TYPE GATEWAY #if DEVICE_TYPE == NODE #error "NODE" #elif DEVICE_TYPE == GATEWAY #error "GATEWAY" #endif root@GATEWAY-0x0000001E:~/gateway/experiments# g++ compile_define.cpp -o compile_define.o compile_define.cpp:4:6: error: #error "NODE" 4 | #error "NODE" | ^~~~~ root@GATEWAY-0x0000001E:~/gateway/experiments# g++ --version g++ (Ubuntu 13.2.0-4ubuntu3) 13.2.0 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. root@GATEWAY-0x0000001E:~/gateway/experiments#
问题原因
C预处理器会将未定义的标识符视为0。你的代码里只定义了DEVICE_TYPE为GATEWAY,但NODE和GATEWAY本身都没有被定义,所以预处理器会把它们替换成0:
DEVICE_TYPE == NODE等价于0 == 0,条件成立,因此触发NODE的#error。- 后续的
#elif分支根本不会被执行。
解决方法
你需要先给NODE和GATEWAY定义具体的数值,让预处理器能区分它们:
// 先定义两个设备类型的标识值 #define NODE 1 #define GATEWAY 2 #define DEVICE_TYPE GATEWAY #if DEVICE_TYPE == NODE #error "NODE" #elif DEVICE_TYPE == GATEWAY #error "GATEWAY" #endif
或者如果你只是想通过宏定义来切换设备类型,也可以用#ifdef的方式:
// 注释掉其中一个来切换设备类型 #define GATEWAY // #define NODE #ifdef NODE #error "NODE" #elif defined(GATEWAY) #error "GATEWAY" #endif
内容的提问来源于stack exchange,提问作者nabelekt
相关产品推荐
相关产品推荐

