Помогите разобраться проверкой определения макроса
- Войдите на сайт для отправки комментариев
Ср, 12/09/2018 - 20:58
Подскажите, возможно ли узнать в фале test.ccp был ли ранее объявлен макрос myConst.
Есть 3 файла: Файл.ino (запускается в Arduino IDE) и файлы test.h, tets.ccp (спокойно лежат в папке libraries).
Файл.ino:
#define myConst 10 // Тут мы определяем макрос myConst !!!
#include <test.h> // Подключаем код файла test.h.
test myObj; // Объявляем объект (экземпляр класса).
void setup(){ //
Serial.begin(9600); //
Serial.println(myObj.myFunc()); // Выводим значение метода myFunc().
} //
void loop(){} //
Файл test.h:
class test{ //
public: //
int myFunc(void); // Объявляем функцию которая будет
}; // возвращать 1 или 2.
Файл tets.ccp:
#include "test.h" //
int test::myFunc(void){ // Определяем объявленную ранее функцию myFunc().
#if defined(myConst) // Если макрос определён, то ...
return 1; // Возвращаем 1.
#else // Если макрос не определён, то ...
return 2; // Возвращаем 2.
#endif //
} //В результате в монитор последовательного порта выводится 2, как будто макрос myConst еще не определён.
Если функцию myFunc() сразу определить в файле test.h (вместо файла test.ccp), то всё работает корректно: в монитор выводится 1 если макрос определён и 2 если не определён.
Сделайте config.h, положите туда свой дефайн и включайте как в .ino, так и .cpp.
для тех у кого нет гугла http://www.c-cpp.ru/books/ifdef-u-ifndef
sadman41 спасибо за ответ, но .h уже включен и в .ino и в .ccp, см код.
qwone, Как писать «#if defined» или «#ifdef» это дело каждого (кому как удобно), ты бы лучше на вопрос ответил, «умник» с гуглом.
sadman41 спасибо за ответ, но .h уже включен и в .ino и в .ccp, см код.
Тогда в чем вопрос? Суйте в его свой дефайн и получайте в обоих файлах его присутствие.
sadman41 Может я не ясно объяснил, попробую повторить:
В коде .ino определён макрос myConst. После чего подключается .h
.h так же подключён и в начале кода .ccp
значит логично что ниже приведённая конструкция кода .ccp должна вернуть 1
#if defined(myConst) // Если макрос определён, то ... return 1; // Возвращаем 1. #else // Если макрос не определён, то ... return 2; // Возвращаем 2. #endif //Но как я написал возвращается 2, как будто макрос myConst еще не определён.
Попробуйте сами не отвечать, а сначала проверить!!!
Вопрос был сформулирован так: нужно в .ccp узнать не определён ли myConst в .ino
Может вы неясно понимаете как компилируются файлы?
В tets.ccp не включен .ino, поэтому определенный там макрос не существует для .cpp-файла, следовательно - не определен. Попробуйте не кидаться с упреками, а подумать над тем, что вы хотите сделать и прочитать, что же все таки делает #include , если не можете догадаться.
Вопрос был сформулирован так: нужно в .ccp узнать не определён ли myConst в .ino
Единственный способ добраться до макроса через препроцессор - сделать перед #ifdef включение файла, содержащего этот макрос. Во всех остальных случаях в области анализа компилируемого исходного кода заданный макрос не определен. Что тут непонятного?
Как дать доступ обоим компилируемым файлам к макросу - я показал. Дальше можете как угодно переформулировать вопрос - компилятор от этого иначе работать не станет.
Понял, значит нет способа опредилить что то в .ino и узнать об этом в .cpp
При компиляции test.cpp то что вы определили в .ino немножко не известно компилятору, он обрабатывает test.cpp в котором только включение test.h и совсем ничего нет про .ino
Вынесите весь код в заголовочный файл и не используйте .cpp
Спасибо Вам sadman41 и Алексей !