gpt4 book ai didi

c - #if 与枚举一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 01:01:28 24 4
gpt4 key购买 nike

我有一个像这样的头文件:

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

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

#define S_FACTOR AB0

现在,函数调用就像

foo(S_FACTOR);

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

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

不能正常工作。

最佳答案

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

#define S_FACTOR AB0

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

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

所以

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

首先会减少到

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

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

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

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

这肯定会计算为 1(根据 bool 值的常用 C 语义),因此处理 #if 的主体。但如果 S_FACTOR 被#defined 为 AB1,它会完全一样。

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

关于c - #if 与枚举一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37284807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com