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 )
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 )
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 :
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é!
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..
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é)
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.
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
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.