如何全局 #define 预处理器变量?

How to globally #define a preprocessor variable?

本文关键字:变量 处理器 预处理 何全局 #define      更新时间:2023-10-16

我正在用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宏配置草图中中断的使用。