如何全局#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
在sketch.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
}
不幸的是,sketch.cpp 中似乎无法识别 MYOPTION 的定义。但是 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
宏配置草图中断的使用。
我正在用 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
在sketch.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
}
不幸的是,sketch.cpp 中似乎无法识别 MYOPTION 的定义。但是 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
宏配置草图中断的使用。