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

时间:2017-07-29 20:55:54

标签: c++ arduino g++ global preprocessor

我正在用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的定义。 Hower sketch.cpp确实识别sketch.h中定义的变量。有没有办法全局定义预处理程序变量,因此可以在任何使用它们的文件中访问它们?

1 个答案:

答案 0 :(得分:2)

  • 将选项定义移至单独的文件,例如options.h。如果你愿意,你也可以在sketch.ino中定义它们。
  • 在sketch.ino和sketch.h中包含options.h。
  • 将所有依赖于Sketch.cpp中MYOPTION宏的代码移动到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_INTERRUPTSENCODER_OPTIMIZE_INTERRUPTS宏配置草图中断的使用。