我正在用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
    }

不幸的是,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_INTERRUPTSENCODER_OPTIMIZE_INTERRUPTS宏从草图配置中断的使用。

    关于c++ - 如何全局#define预处理程序变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45393975/

    10-10 04:02