Как глобально #define переменная препроцессора?

Я программирую скетч Arduino на C++. Я хочу, чтобы пользователь мог #defineконстанта прямо в файле sketch.ino, которая понадобится для компиляции кода. В 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. Есть ли способ определить переменные препроцессора глобально, чтобы они были доступны в любом файле, который их использует?

1 ответ

Решение
  • Переместите определения параметров в отдельный файл, например, options.h. Вы также можете определить их в sketch.ino, если хотите.
  • Включите options.h в sketch.ino и sketch.h.
  • Переместить весь код, который опирается на MYOPTION макрос из sketch.cpp в sketch.h.
  • определять MYOPTION в sketch.ino перед включением sketch.h:
#include "options.h"
#define MYOPTION OPTION_2
#include "sketch.h"

Вот пример популярной библиотеки, которая использует эту технику:

https://github.com/PaulStoffregen/Encoder

Это позволяет пользователю настроить использование прерываний из эскиза через ENCODER_DO_NOT_USE_INTERRUPTS а также ENCODER_OPTIMIZE_INTERRUPTS макросы.

Другие вопросы по тегам