2017-07-29 88 views
0

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

在草图.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中定义的变量。有没有一种方法可以在全局范围内定义预处理器变量,因此可以在任何使用它们的文件中访问它们?

+1

优化的好处在于你使用的'g ++'编译器?你可能想要所有这些前处理器垃圾,并让你的编译器照顾它,因为使用带有'enum'的标准'if'可以做到所有这一切,而且整个过程不那么糟糕。通常最好使用'const'而不是'#define'。 – tadman

+0

@tadman预处理器无法优化我的代码。该代码旨在根据所附的硬件进行定制。用户提供的选项决定了该硬件所需的时间关键功能的哪些部分。由于(本例中)Arduino Due的内存限制,提供多种功能是没有意义的。 – uzumaki

+0

'MYOPTION'的定义看起来可疑,等号。 –

回答

2
  • 将选项定义移动到单独的文件,例如, options.h。如果你喜欢,你也可以在sketch.ino中定义它们。
  • 在sketch.ino和sketch.h中包含options.h。
  • 将所有依赖于MYOPTION宏的代码从sketch.cpp移到sketch.h。
#include "options.h" 
#define MYOPTION OPTION_2 
#include "sketch.h" 

这里有一个通俗图书馆的一个例子,使用这种技术:

https://github.com/PaulStoffregen/Encoder

它允许用户

  • 包括sketch.h前sketch.ino定义MYOPTION通过ENCODER_DO_NOT_USE_INTERRUPTSENCODER_OPTIMIZE_INTERRUPTS宏配置草图中断的使用。