【问题标题】:#if usage with enums#if 与枚举一起使用
【发布时间】:2016-05-17 19:31:41
【问题描述】:

我有一个类似这样的头文件:

enum DataRate {
    AB0,
    AB1,
    AB2,
    ...
};

在我的代码中我有类似的东西

#define S_FACTOR AB0

现在,函数调用像

foo(S_FACTOR);

似乎工作正常,但条件编译

#if ( (S_FACTOR == AB0) || (S_FACTOR == AB2) )

不能正常工作。

【问题讨论】:

    标签: c if-statement enums c-preprocessor preprocessor-directive


    【解决方案1】:

    预处理器对枚举一无所知;它只是文本的操纵器。当你提供

    #define S_FACTOR AB0
    

    您是在告诉预处理器将标记S_FACTOR 替换为标记AB0,仅此而已。

    #if 预处理器指令有点奇怪。它仍然只做文本替换,目的是将其参数简化为涉及整数常量的算术表达式。因此,它首先替换表达式中所有已定义的宏。然后它将任何剩余的标识符标记替换为 0,并尝试计算表达式。

    所以

    #if ( (S_FACTOR == AB0) || (S_FACTOR == AB2) )
    

    将首先缩减为

    #if ( (AB0 == AB0) || (AB0 == AB2) )
    

    因为S_FACTOR 是一个带有替换列表的宏。

    然后它将所有标识符替换为0:

    #if ( (0 == 0) || (0 == 0) )
    

    这肯定会计算为 1(通过布尔值的通常 C 语义),所以 #if 的主体被处理。但如果S_FACTOR 被#defined 为AB1,情况就会完全一样。

    预处理器被称为pre处理器是有原因的。它在任何其他处理(包括声明)之前完成其工作。

    【讨论】:

    • 好的,我明白了。如果我想使用 '#define' 来设置条件编译,除了简单的 '#define SNA' 和 '#define FOO' 之外还有其他方案,以便稍后我可以对它们执行简单的逻辑(就像我所做的那样)?
    • 嗯.. 现在似乎很清楚我不为此使用枚举! (我使用的枚举是在一个 .h 文件中提供给我的,所以我必须想出一些东西)。 谢谢!
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多