Помогите разобраться проверкой определения макроса

redsunset
Offline
Зарегистрирован: 12.09.2018

Подскажите, возможно ли узнать в фале 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 если не определён.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Сделайте config.h, положите туда свой дефайн и включайте как в .ino, так и .cpp.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

для тех у кого нет гугла http://www.c-cpp.ru/books/ifdef-u-ifndef

redsunset
Offline
Зарегистрирован: 12.09.2018

sadman41 спасибо за ответ, но .h уже включен и в .ino и в .ccp, см код.

redsunset
Offline
Зарегистрирован: 12.09.2018

qwone, Как писать «#if defined» или «#ifdef» это дело каждого (кому как удобно), ты бы лучше на вопрос ответил, «умник» с гуглом.

sadman41
Offline
Зарегистрирован: 19.10.2016

redsunset пишет:

sadman41 спасибо за ответ, но .h уже включен и в .ino и в .ccp, см код.

Тогда в чем вопрос? Суйте в его свой дефайн и получайте в обоих файлах его присутствие.

redsunset
Offline
Зарегистрирован: 12.09.2018

sadman41 Может я не ясно объяснил, попробую повторить:

В коде .ino определён макрос myConst. После чего подключается .h

.h так же подключён и в начале кода .ccp

значит логично что ниже приведённая конструкция кода .ccp должна вернуть 1

#if defined(myConst) // Если макрос определён, то ...
    return 1;        // Возвращаем 1.
#else                // Если макрос не определён, то ...
    return 2;        // Возвращаем 2.
#endif               //

Но как я написал возвращается 2, как будто макрос myConst еще не определён.

Попробуйте сами не отвечать, а сначала проверить!!!

Вопрос был сформулирован так: нужно в .ccp узнать не определён ли myConst в .ino

sadman41
Offline
Зарегистрирован: 19.10.2016

Может вы неясно понимаете как компилируются файлы?  

В tets.ccp не включен .ino, поэтому определенный там макрос не существует для .cpp-файла, следовательно - не определен. Попробуйте не кидаться с упреками, а подумать над тем, что вы хотите сделать и прочитать, что же все таки делает #include , если не можете догадаться.

redsunset
Offline
Зарегистрирован: 12.09.2018

Вопрос был сформулирован так: нужно в .ccp узнать не определён ли myConst в .ino

sadman41
Offline
Зарегистрирован: 19.10.2016

Единственный способ добраться до макроса через препроцессор - сделать перед #ifdef включение файла, содержащего этот макрос. Во всех остальных случаях в области анализа компилируемого исходного кода заданный макрос не определен. Что тут непонятного?

Как дать доступ обоим компилируемым файлам к макросу - я показал. Дальше можете как угодно переформулировать вопрос - компилятор от этого иначе работать не станет.

redsunset
Offline
Зарегистрирован: 12.09.2018

Понял, значит нет способа опредилить что то в .ino и узнать об этом в .cpp

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

При компиляции test.cpp то что вы определили в .ino немножко не известно компилятору, он обрабатывает test.cpp в котором только включение test.h и совсем ничего нет про .ino
Вынесите весь код в заголовочный файл и не используйте .cpp

redsunset
Offline
Зарегистрирован: 12.09.2018

Спасибо Вам sadman41 и Алексей !