【发布时间】:2015-06-05 16:52:35
【问题描述】:
我告诉其他人cc -DFOO 与cc -DFOO=1 相同,但我不太确定是否所有编译器都支持这一点。那么它是 C 编译器的标准吗?
(在接受的答案的启发下,找到了最近的 POSIX c99 标准,2016 版。仅供参考。)
【问题讨论】:
标签: c compilation c-preprocessor
我告诉其他人cc -DFOO 与cc -DFOO=1 相同,但我不太确定是否所有编译器都支持这一点。那么它是 C 编译器的标准吗?
(在接受的答案的启发下,找到了最近的 POSIX c99 标准,2016 版。仅供参考。)
【问题讨论】:
标签: c compilation c-preprocessor
它不是 C 编译器的标准,尽管它是 POSIX 兼容系统的标准。见the cc manual。
【讨论】:
ISO 标准只要求未定义的宏计算为零。因此,虽然将定义的值设为非零是有意义的,但它不是必需的。值 1 作为非零值也有意义,因为这是一个真正的布尔表达式在转换为整数时的值。
因此,虽然它不是“标准”,但它可能是最有可能和最不反常的实现。但是,您不应该真正提倡按值对此类宏进行显式测试,因为这样做表明明显缺乏谨慎。此类宏应仅针对定义而非值进行测试。
请注意,如果FOO 未定义,则#if defined FOO FOO 形式的表达式解析为#if 0L,如果FOO 已定义,则解析为#if 1L,但这是对defined FOO 的评估并且什么也不说关于FOO的值。
在FOO 已定义但没有明确分配值的情况下,以下行为具有明确定义:
#ifdef FOO
#ifndef FOO
#if defined FOO
#if !defined FOO
#if FOO != 0
#if FOO == 0
这可能是足够的选择不提倡:
#if FOO == 1
【讨论】:
#define FOO一样。
-DFOO 。 C 标准没有定义编译器命令行开关。根据此线程中报告的结果,似乎许多编译器将-DFOO 实现为#define FOO 1。