如何全局 #define 预处理器变量?
How to globally #define a preprocessor variable?
我正在用C++编写Arduino草图。我希望用户能够直接在sketch.ino文件中#define
一个常量,这是编译代码所必需的。Arduino IDE使用g++编译器。
假设我们有三个文件:
sketch.ino
sketch.h
sketch.cpp
在sketch.h中,我定义了
#define OPTION_1 0
#define OPTION_2 1
#define OPTION_3 2
#define OPTION_4 3
#define SLOW 0
#define FAST 1
在sketch.ino中,用户定义MYOPTION:
#define MYOPTION OPTION_2
在sketch.h中,我使用该变量来定义宏:
#if MYOPTION == OPTION_1 | MYOPTION == OPTION_2
#define SPEED FAST
#else
#define SPEED SLOW
#endif
在草图中.cpp我用它来改进时间关键型代码:
MyClass::foo() {
// do something
#if SPEED == FAST
// do more
#if MYOPTION == OPTION_2
// do something extra
#endif
#endif
#if MYOPTION == OPTION_4
// do something else
#endif
}
不幸的是,MYOPTION的定义似乎在sketch.cpp中没有得到认可。Hower sketch.cpp 确实可以识别 sketch.h 中定义的变量。有没有办法全局定义预处理器变量,以便可以在使用它们的任何文件中访问它们?
- 将选项定义移动到单独的文件中,例如 options.h。如果你愿意,你也可以在sketch.ino中定义它们。
- 在sketch.ino和sketch.h中包含options.h。
- 将所有依赖于
MYOPTION
宏的代码从 sketch.cpp 移动到 sketch.h。 - 在包含 sketch.h 之前在 sketch.ino 中定义
MYOPTION
:
#include "options.h"
#define MYOPTION OPTION_2
#include "sketch.h"
下面是使用此技术的流行库的示例:
https://github.com/PaulStoffregen/Encoder
它允许用户通过ENCODER_DO_NOT_USE_INTERRUPTS
宏和ENCODER_OPTIMIZE_INTERRUPTS
宏配置草图中中断的使用。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 如何全局 #define 预处理器变量?
- 用于在运行时选择变量的 C++ 预处理器指令
- 在宏中定义然后取消定义预处理器变量
- 在预处理器命令中使用 qmake 变量 #include
- 使用预处理器定义多个相似的变量C++
- 如何通过Visual Studio中的预处理器传递包含字符串和引号的环境变量
- 预处理器/条件变量定义
- 使用预处理器技巧定义和声明全局变量
- 组合预处理器宏和变量
- 交换变量(C++,处理器级)
- 模板/预处理器的hack可以用来支持参数列表中间的变量参数吗?
- 使用预处理器的 #ifdef 更改变量的类型
- 预处理器:如何使用列表来定义变量和函数输入
- c预处理器-用c++#define替换对变量的所有引用
- 避免重新定义预处理器变量