如何解决在预处理程序指令C ++中使用比较运算符
我想基于常量值定义一些函数:
#define mode 5
#if mode & 2 != 0
// function 1
#endif
#if mode & 4 != 0
// function 2
#endif
这听起来似乎很奇怪,但是我想使用一个常量来定义和激活一些程序模块。
定义mode = 2
包括功能1,mode = 4
包括功能2,而mode = 6
包括两个功能。
有一个问题:==
,!=
,>
或<
之类的比较运算符似乎在指令中不起作用,并且#if
语句始终执行。
我在做什么错?我是在尝试做愚蠢或不可能的事情吗?
解决方法
&
的{{3}}比!=
低。所以:
MODE & 2 != 0
与
相同MODE & (2 != 0)
2 != 0
在逻辑上是正确的,因此!=
运算符的结果为1
。因此,这与
MODE & 1
它只是检查第一位。在需要的时候:
(MODE & 2) != 0
检查第二个位是否已设置。但实际上只需删除!=
部分并执行:
#if MODE & 2
记住precendence。
这听起来可能听起来很奇怪
不,听起来很正常。我会使用更多描述性的名称,然后普通的& 2
-prefer upper case names for macro names会令人困惑。喜欢:
#define MODE (MODE_ENABLE_FUNC_1 | MODE_ENABLE_FUNC_2)
#define MODE_ENABLE_FUNC_1 (1<<0)
#define MODE_ENABLE_FUNC_2 (1<<1)
#define MODE_ENABLE_FUNC_3 (1<<2)
#define MODE_IS_ENABLED(mode,feature) ( ((mode) & (feature)) != 0)
#if MODE_IS_ENABLED(MODE,MODE_ENABLE_FUNC_1)
// etc.
如果可能的话,更喜欢使用C ++模板和SFINAE,而不是普通的C宏。
我在做什么错了?
您假设!=
的优先级低于&
。
我要做愚蠢或不可能的事情吗?
否。
我记得magic numbers部分,他在节名Neonatal C
中写道:
[...]在从B转换为C的过程中,要在这样的语句中用&&替换&;为了减少转换的麻烦,我们决定将&运算符的优先级相对于==保持相同,并且仅将&&的优先级与&分开。今天,似乎更可取的是 &和==的相对优先级,从而简化了公共C 习惯用法:要针对另一个值测试屏蔽值,必须写出
if ((a&mask) == b) ...
需要内括号但很容易忘记的地方。
不用担心-您不是第一个也是最后一个忘记&
和另一个运算符上下文中的花括号的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。