【发布时间】:2020-10-26 14:25:15
【问题描述】:
我想根据一个常数值定义一些函数:
#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 语句。
我做错了什么?我是在尝试做一件愚蠢或不可能的事情吗?
【问题讨论】:
-
“似乎在指令中不起作用,只是被忽略了” - 不清楚你在这里的意思。一般来说,“不起作用”不是一个有用的问题陈述。请修改您的minimal reproducible example 以准确说明问题所在。如果有错误,请逐字复制。如果它运行但做错了事,请说出您的期望以及实际发生的情况。
-
mode & 2 != 0不是(mode & 2) != 0 -
在这种情况下,为了避免问题,我更喜欢使用
constexpr int mode = 5;等。 -
FWIW,另一种不使用预处理器的方法是使用
template <int N> void my_function_set(...);之类的模板,然后将其专门用于N的不同值,然后您将只需my_function_set<constant>(...)在呼叫站点。 -
@Damien - 你可以使用
constexpr,但是你会遇到它在条件编译中完全没用的问题。 C++ 可能已经大大减少了对预处理器的需求,但它还没有取代它的所有用途(目前)。
标签: c++ arduino c-preprocessor directive comparison-operators