Я программирую скетч 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. Однако sketch.cpp распознает переменные, определенные в sketch.h. Есть ли способ определить переменные препроцессора глобально, чтобы к ним можно было получить доступ в любом файле, который их использует?
g++
, который вы используете? Возможно, вы захотите обойти весь этот мусор препроцессора и позволить вашему компилятору позаботиться об этом, поскольку использование стандартногоif
сenum
может сделать все это так же хорошо с гораздо меньшим беспорядком. Обычно лучше использоватьconst
вместо#define
. - person tadman   schedule 29.07.2017MYOPTION
выглядит подозрительно со знаком равенства. - person Robert Prévost   schedule 30.07.2017if (false)
будет удален любым оптимизирующим компилятором. Вам действительно нужны фактические блоки типа#ifdef
только в том случае, если код внутри этого блока не будет компилироваться на какой-либо платформе. - person tadman   schedule 30.07.2017MY_OPTION_2
и т. д., но перед#if
). - person Peter   schedule 30.07.2017