【问题标题】:Using true and false in macros in C99在 C99 的宏中使用 true 和 false
【发布时间】:2016-12-15 07:09:15
【问题描述】:

我正在使用支持 C99 子集的定制 gcc 编译器编写一些代码。使用编译器选项,我定义了一个这样的宏:

ENABLE_LOGGING=true

我在我的代码中这样使用它:

#if ENABLE_LOGGING
#define LOG(foo) { log(foo); }
#else
#define LOG(foo)
#endif

结果证明这并不可靠。有时使用包含代码的LOG,有时使用emtpy LOG(相同的项目,相同的编译器设置)。

将宏参数更改为:

ENABLE_LOGGING=1

一切正常。

我了解预处理器可能不知道true。但是,为什么它在大多数时候都有效?为什么我在编译不起作用的模块时没有收到警告或错误?

【问题讨论】:

  • ENABLE_LOGGING=true 不是有效的 C 宏声明。你的意思是#define ENABLE_LOGGING true 还是别的什么?
  • 我使用编译器选项定义它,而不是使用代码。以上是编译器选项使用的格式。

标签: c boolean c-preprocessor c99 preprocessor-directive


【解决方案1】:
#define hehe true
#if hehe
#error hehe
#else
#error haha
#endif

#error haha 因为hehe 扩展为truetrue 将被0 替换,因为

§6.10.1¶4 所有剩余的标识符(包括词法上的标识符) 与关键字相同)替换为 pp 编号 0

但是如果你在#if之前碰巧#include <stdbool.h>,它会#error hehe,因为

§7.18 标题定义了四个宏。 …

¶3 其余三个宏适合在#if 预处理中使用 指令。它们是 true 扩展为整数常量 1

【讨论】:

    猜你喜欢
    • 2016-03-07
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2012-08-14
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多