GCC命令行通过-D定义符号未显式赋值时的默认值是多少?
结论
你测试得到的所有编译运行表现都是完全符合GCC预期的标准行为。
规则说明
- GCC的
-D预处理器参数遵循通用C标准约定:- 当使用
-D<宏名>格式,不显式指定赋值时,该宏会被预处理器默认定义为值1 - 当使用
-D<宏名>=<值>格式时,宏才会被定义为你指定的具体值
- 当使用
- C标准
#if预编译指令的判断规则:如果#if后跟随的宏未被定义,预处理器会默认将其当作0处理,所以不加-D定义MY_FLAG的场景下会走到#else分支;而-Wundef是GCC的可选警告参数,作用就是主动提醒开发者存在未定义就被#if使用的宏,避免隐含逻辑错误。
对应测试场景解释
gcc -DMY_FLAG test.c:MY_FLAG被默认定义为1,#if判断为真,输出MY_FLAGgcc -DMY_FLAG=0 test.c:MY_FLAG被显式定义为0,#if判断为假,输出hello, world!gcc -DMY_FLAG=1 test.c:MY_FLAG被显式定义为1,#if判断为真,输出MY_FLAG- 不加
-D参数编译:MY_FLAG未定义,#if判断时被当作0,输出hello, world! - 加
-Wundef不加-D编译:触发未定义宏的警告,同时MY_FLAG还是被当作0处理,输出hello, world!
问题答案
仅使用-DMY_FLAG不显式赋值的场景下,MY_FLAG的实际取值为1。
内容的提问来源于stack exchange,提问作者bruin
相关产品推荐
相关产品推荐

