Préprossesseur et arduino

Salut tous , je me pose une question , j’ignore si le sujet a deja été traité car je ne trouve pas la reponse!

je voulais savoir quelle été la “porté” du langage préprossesseur avec l’IDE arduino ,( ce n’est peut’etre pas le bon therme! dsl)
en gros losque dans une librairie j’utilise ceuci :

#define DEBUG_SERIAL
//avec cela dans le code 

#ifdef DEBUG_SERIAL
#endif

comment le compilateur fait t’il ça sauce car j’ai la sensation que selon les cas ça n’est pas vue. car je suis obligé de le déclaré le #define DEBUG_SERIAL a la foi dans le sketch et dans mes librairie.

un #define n'a de portée que par .cpp (une unité de compilation, bloc élémentaire avec la norme C/C++). Si tu le définis dans un .cpp, il n'est pas vu ailleurs.
Si tu le mets dans un .h et que tu le #include, il sera accessible au .cpp qui le #include

alors je fait peut'etre fause route mais la constante DATE ou les macro PSTR ou F() sont bien defini par des preprosseseur en # define et pourtant pas besoin de les reecrire dans le sketch.( il est possible que je melange tout mais dans le doute je prefere poser la question :grin:)

XavierMiller:
Si tu le mets dans un .h et que tu le #include, il sera accessible au .cpp qui le #include

ce que tu veux dire c'est : au lieu de le definir dans le .cpp je le met dans le header ".h" et la lorsque j'inclurai ma lib dans mon sketch il sera vue ?

ok apres test effectivement si dans le .h d'une de mes lib je defini la ligne DEBUG_serial sa porté est générale est fonctionne sur mon sketch aussi , par contre l'inverse ne marche pas si je le defini dans le sketch il n'a une porté que local sur le sketch lui meme
( c'est chiant :drooling_face:)

Oui il sera vu mais attention à une subtilité : à cause d'histoire d'ordre de compilation, il n'est pas possible de configurer une lib à partir du sketch. Exemple :

Sketch :

#define DEBUG

dans la lib

#ifdef DEBUG

Serial.println(Variable);

#endif

Ne marchera pas

oui c'est bien ce que je vien de comprendre!
sinon je vais essayer en creant un simple .h dans le repertoir du sketch en y plassant les #define , ce .h sera inclut dans le sketch.
j'imagine que cela devrai fonctioné!

@*!Arg!!!
le comportement est le meme que lorsque l'on place dans le sketch ]:slight_smile:

// dans le sketch
#include "mydefine.h"
//dans le .h
#ifndef MYDEFINE_H_INCLUDED
#define MYDEFINE_H_INCLUDED

#define DEBUG_SERIAL


#endif // MYDEFINE_H_INCLUDED

Cherche pas, sur IDE Arduino il n'y a pas de solution à ce problème, on l'a déjà évoqué plusieurs fois.

B@tto:
Oui il sera vu mais attention à une subtilité : à cause d'histoire d'ordre de compilation, il n'est pas possible de configurer une lib à partir du sketch. Exemple :

Sketch :

#define DEBUG

dans la lib

#ifdef DEBUG

Serial.println(Variable);

#endif




Ne marchera pas

Ce comportement n'a rien de spécifique à Arduino : comme je le dis plus haut, les #define ne se portent qu'à une unité de compilation. Une Lib n'est pas compilée dans le même "objet" que le .ino, donc le #define du .ino n'est pas vu dans la lib..

bon alors je ne m'acharne pas mais c'est franchemant chiant ! :~

Normalement ce genre de paramètre est défini dans les arguments passé à la chaîne de compilation.
Le problème c'est que dans l'IDE on a pas cette possibilité.
Éventuellement le définir dans un .h (genre global.h) qui sera appelé dans tous les modules que tu utilises.

Dapres mes teste voici en résumé ce qui marche :
un "#define" situer dans le .h d'une librairie( quelconque) a une porté sur la lib et sur le sketch qui inclu cette librairie ,
mais n'est pas vue par les autres librairies, de meme si on un "#define" dans le sketch celui ci n'est alors vus que dans le sketch!

alors la question qui me vien c'est est ce que l'on retrouve le meme probleme avec les #include car il me semble aussi avoir eu des souci de compilation lorsque les lib n'estait pas inclu dans chaque fichier ( possible que je me soit fortement planté)

Je sais pas si ça va répondre à ta question mais faire un #include d'un .h fait que tu #include également tous ce #include dans ce .h . Pas clair ? :smiley:

Exemple :

maLib.h :

#include blabla.h

....

monAutreLib.h :

#include maLib.h 
#include blabla.h => inutile car inclut avec#include maLib.h

...

Par contre l'inverse n'est pas possible, ce qui explique pourquoi tu ne peux pas faire ce que tu veux. Il n'est pas possible de "faire remonter" quelque chose, puisque dans ton sketch tu fais des includes et non l'inverse. Si dans ta lib tu pouvais faire un #include de ton programme alors oui, mais c'est impossible.

oui c'est claire :grin:

j'avais remarqué que lorsque dans un sketch on oubli d'inclure une lib qui est inclus dans une autre lib parfoi ça ne fonctione pas!
pas claire non plus je croi :grin:

C’est hierarchique : si deux lib en inclus une même troisième, ces deux lib ne seront pas “connectées”. Pour ce faire il faudra inclure 1 dans 2 et/ou vice versa suivant ce qu’on veut

Comme l'a expliqué XavierMiller au début, les .cpp (ou le .ino) sont compilés un par un donc les inclusions doivent apparaître explicitement dans chaque fichier. Par contre un .h peut inclure des #include vers d'autres .h.

ok merci a tous !
:slight_smile: