как определить наличие/отсутствие модуля

vde69
Offline
Зарегистрирован: 10.01.2016

есть некий проект состоящий из нескольких файлов, в нем нужно при компиляции исключить часть кода в случае отсутсвии определеного файла/функции, есть у меня предположение что надо использовать конструкцию #if defined но описания что-то не нашел....

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016
#if defined MODULE
#endif

#ifdef MODULE
#endif

#if !defined MODULE
#endif

#ifndef MODULE
#endif

 

vde69
Offline
Зарегистрирован: 10.01.2016

MODULE - это имя файла? с расширением? или имя объекта/переменной ???

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Делаешь общий заголовочный файл, обзываешь его что-то типа Globals.h, внутри пишешь:

#ifndef _GLOBALS_H
#define _GLOBALS_H

#define USE_MODULE1 // использовать первый модуль
#define USE_MODULE2 // использовать второй модуль


#endif

Везде, где нужны эти определения, подключаешь Globals.h:

#include "Globals.h"

И пишешь:

#ifdef USE_MODULE1 
 // код, который будет компилироваться, если определена USE_MODULE1
#endif

В *.ino файле можно подключать заголовочные файлы в зависимости от директив:

#ifdef USE_MODULE1
#include "MyModule.h" // подключаем объявление нашего класса

// создаём глобальную переменную класса MyModule, 
// которая будет включена в компиляцию только есть USE_MODULE1 определена.
MyModule myModule; 

#endif

Вот как-то так. Чтобы выключить куски кода из компиляции - достаточно будет закомментировать строчку #define USE_MODULE1 в файле Globals.h - надеюсь, пример понятен.

axill
Offline
Зарегистрирован: 05.09.2011

Определить наличие или отсутствие файла средствами компилятора не получится

это можно сделать в makefile, только это не совсем про ардуину

vde69
Offline
Зарегистрирован: 10.01.2016

а директивы #ifdef допускают вложения?????

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vde69 пишет:

а директивы #ifdef допускают вложения?????

Вы имеете в виду что-то типа такого?

#ifdef USE_MODULE1
// этот кусок кода будет включён, если USE_MODULE1 определена

#ifdef USE_MODULE2
// этот кусок будет включён, если определены USE_MODULE1 и USE_MODULE2
#else
// этот кусок будет включён, если определена USE_MODULE1 и не определена USE_MODULE2
#if

#endif

Вообще советую почитать про директивы препроцессора - инфы в гугле валом.