Peut-on gérer les #define dans un constructeur

Bonjour à tous,

J'aimerais perfectionner ma librarire.

Pour le moement, elle commence comme cela

#include "Arduino.h"
#include "Smartidea.h"



#define LOGGER
#define FEATHERWINGS
#define DEBUG


Smartidea::Smartidea(bool debug, bool logger)
//Smartidea::Smartidea()
{
  _logger = logger;
  _debug = debug;
	#ifdef LOGGER
		File readFile;
	#endif
	_carddetect = 7;
	_chipselect = 4;
	_isSdReady = false;
	_sd_path[SD_PATHSIZE]; // /SOS/2015/12/22/
  _logFile[SD_PATHSIZE+FILESIZE];
}

Puis plus bas, j'ai un truc du genre

void Smartidea::sprint(int message, int base, int logToSd)
{
  if (logToSd == 0 || logToSd == 2)
  {
  	#ifdef DEBUG
	    Serial.print(message,base);
  	#endif
  }

  if (logToSd == 1 || logToSd == 2)
  {
    #if defined(LOGGER) && defined(FEATHERWINGS)
      //Serial.print("Check here:");
      char mess[10];
      snprintf(mess,sizeof(mess), "%d", message);
      //Serial1.print(message, 'HEX');
      _sd_write(_logFile, mess);
    #endif
  }
}

Quand dans mon fichier .ino je fais ceci:

Smartidea Si(true,false); //bool debug, bool logger

Quand le debug est activé, j'aimerais que dans malib.cpp
#define GABUG
soit egal à un

Est-ce qu'on peut faire ceci

#include "Arduino.h"
#include "Smartidea.h"



#define LOGGER
#define FEATHERWINGS


Smartidea::Smartidea(bool debug, bool logger)
//Smartidea::Smartidea()
{
  _logger = logger;
  _debug = debug;
	#ifdef LOGGER
		File readFile;
	#endif
	_carddetect = 7;
	_chipselect = 4;
	_isSdReady = false;
	_sd_path[SD_PATHSIZE]; // /SOS/2015/12/22/
  _logFile[SD_PATHSIZE+FILESIZE];
if(_debug==true){
   #define DEBUG
}

}

Faudrait-il plus tôt mettre cette condition dans le begine

void Smartidea::begin()
{
if(_debug==true){
   #define DEBUG
}
}

Comment feriez-vous ceci de manière optimal?

Sauf erreur de ma part, un #define QUELQUECHOSE, quand il est commenté, ceci allège ma librarire.
Mais il me semble que de mettre trop de #ifdef #else#endif, est aussi un désaventage, il me semble
Que me diriez-vous à ce sujet?

Mon but est de pouvoir contrôler depuis mon .ino, si ma librairie affiche les messages dans mon terminal ou s'il écrit dans ma carte SD.

Merci pour vos lumières

Bonjour,

Tu ne peux pas conditionner le #define à un test dans le programme.
Il faut bien avoir en tête que les directives comme #define sont traitées par le préprocesseur avant la compilation, donc ce que tu veux faire est strictement impossible.

En général pour faire ce genre de chose, on met le define dans la ligne de commande du compilateur, mais je ne pense pas qu’on puisse la faire (facilement) avec l’IDE arduino.

Tu peux utiliser ton indicateur _debug, mais les instructions seront quand même générées.

Salut Kamil,

Merci pour ta réponse.

Donc, si j'ai bien compris, je n'ai d'autre choix de supprimer

#define DEBUG
#ifdef DEBUG
#id defined(DEBUG)
#else
#endif

et de les remplacer par

if(_debug){
//fait quelque chose
}

En soit ne plus utiliser les

#define DEBUG
#define OLED
#define LOGGER

soit tout ce que je passe en parametre dans mon constructeur.

N'est-ce pas?

Autre chose, une fois on m'avais dit qu'il fallait éviter les directive comme les

#ifdef DEBUG

Je ne sais plus la raison qui m'a été évoqué.

Sais-tu les aventages que je vais trouver en remplaçant ce que j'ai évoqué plus haut?

Milles mercis pour tes lumières

le truc c'est que les directives me font gagner pas mal de place, que je les commente :slight_smile:

Tu peux utiliser #define DEBUG et le mettre en commentaire si tu ne veux pas qu'il soit défini, mais ce ne sera pas dynamique, ça nécessite une recompilation.
Si tu veux que le fonctions de debug dépendent d'une variable, effectivement la seule solution que je vois est celle que tu as envisagée.

if(_debug){
//fait quelque chose
}