Как глобально #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
макросы.