2017-07-29 94 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宏配置草圖中斷的使用。