как использовать #ifdef в CPP файле ???
- Войдите на сайт для отправки комментариев
суть проблеммы:
от основной программы отделил файл #include "A_Config.h", именно в этом файле устанавливаю #define DATE_TIME_USE (переносить установку в основной модуль очень не хочется)
далее я хочу, что-бы в CPP файла проекта (там их много) работала директива #ifdef DATE_TIME_USE
но тут проблемма, cpp файлы собираются все вместе еще до обработки #include "xxx.h" и по существу весь мой код вырезается а только потом устанавливается директива #include
какие будут предложения?
я пока вижу следующие варианты:
1. отказатся от использования файла A_Config.h и все перенести в основной файл, но мне не нравится это
2. перенести весь код CPP в H файл, но я не понимаю чем это грозит. На вскидку могут быть проблеммы с видимостью объектов...
Какую-то фигню вы написали. ВСЕ заголовочные файлы, подключённые как в *.h, так в *.cpp и в *.ino - разбираются _до_ начала обработки собственно исходников. Юзаю препроцессорные директивы в хвост и в гриву, версия IDE 1.6.7, всё прекрасно собирается.
Можете проверить на простом тесте:
1. Файл A_Config.h:
2. Файл Some.h:
3. Файл Some.cpp:
4. Файл *.ino проекта:
И прошить в МК. Если определена директива DATE_TIME_USE - то в Serial должна вывестись строка, если директиву закомментировать и пересобрать прошивку - строки не будет. Писал навскидку, думаю, принцип понятен.
ну я почти так и делал, вся разница в том, что у Вас в cpp под директиву убраны 2 строки внутри процедуры а я убирал всю процедуру целиком, и компилятор банально выдавал ошибку вне зависимости от наличия DATE_TIME_USE
пока единственное что у меня получается с тем функционалом который мне нужен - это перенос всего условного кода внутрь объекта в h файле, тогда все нормально работает.
Ваш вариант пока не пробовал, может и взлетит, но у меня задача вырезать не отдельный оператор а весь класс целиком... Конечно не очень красиво...
пока остановился на таком варианте, условие на 26 строке
ну я почти так и делал, вся разница в том, что у Вас в cpp под директиву убраны 2 строки внутри процедуры а я убирал всю процедуру целиком, и компилятор банально выдавал ошибку вне зависимости от наличия DATE_TIME_USE
Значит, неправильно делали. Переписать вам мой пример с обрамлением всей процедуры?
1. Файл A_Config.h:
2. Файл Some.h:
3. Файл Some.cpp:
4. Файл *.ino проекта:
расечатать?
Ваш вариант пока не пробовал, может и взлетит, но у меня задача вырезать не отдельный оператор а весь класс целиком... Конечно не очень красиво...
Что значит "может и взлетит"? Куда оно денется - это же препроцессор, если понимать, как его использовать и почитать документацию - практически никаких ограничений, надо только грамотно юзать. Можно и весь класс убрать из компиляции, не вопрос. Проблем не вижу вообще, вернее, вижу одну проблему с вашей стороны - непонимание того, как работает препроцессор. Чуть-чуть разберётесь - и всё получится ;)
sketch\a_house.ino.cpp.o: In function `loop':
D:\arduino\mu_progect_169\a_house/a_house.ino:199: undefined reference to `addon_DateTime::poll(unsigned long)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino Nano.
Правильно, осталось только поправить эту ошибку, и всё. Вы вызываете функцию, которая была исключена директивами препроцессора. Если обрамить вызов этой фунции теми же директивами препроцессора, то вызов этой функции не попадёт в результирующий код.
Вы мой пример-то пробовали, или сразу кинулись готовый проект портить? Без понимания, как работают директивы препроцессора - не взлететь.