Pour que #ifdefnom soit vrai il faut que nom ait été défini dans un #define (ou dans la ligne de commande)
Il est donc impossible de savoir si une fonction a été définie par un #ifdef en donnant sont nom dans le #ifdef.
Il faut faire l'inverse c'est à dire définir la fonction si le nom est défini (par un #define)
Donc, si j'ai bien compris, il n'est pas possible de vérifier si l'instance à été créée. Je suis obligé de reseigner le programme des instances créées pour en suite avoir une valeur à tester.
il faut conditionner la création de l'instance par le test de définition d'une variable qui sera définie (ou non) par un #define. On peut ensuite tester cette variable par des #ifdef.
Je me demande si on ne pourrait pas gérer le problème différemment en faisant un tableau d'instances et en testant la taille du tableau avec un sizeof().
on peut aussi créer l'instance par new, et travailler avec le pointeur:
SimpleBouton* bouton2 = NULL;
bouton2 = new SimpleBouton ( ... ); // ligne à commenter ... ou pas
.../...
if ( bouton2 != NULL ) {
// ici bouton2 existe
}
On peut se reposer sur le compilateur pour initialiser des trucs à zéro, ou autre chose.
Mais c'est quand m^me beaucoup mieux de le faire explicitement, ça montre une intention (je veux qu'il soit nul, alors je l'écris). Pour ce que ça coûte ! simpleBouton* bouton1 = NULL;
Si j'écris simpleBouton* bouton1;
ça veut dire : je crée une variable et je me fous de sa valeur. Je l'affecterai plus tard.
Donc si je crée par un tableau de pointeurs, je peux ajouter le "=NULL" avec un for{} dans le "setup()" avant de déclarer les objets (bouton).
...
const uint8_t nombreBoutons = 5; //nombre d'emplacements disponibles pour les boutons
simpleBouton* bouton[nombreBoutons];
void setup(){
//Renseigner les variables boutons
for (uint8_t i = 0; i < nombreBoutons; i++) {
bouton[i] = NULL;
}
//Initialiser les boutons >>> A positionner après avoir renseigner les variable à "NULL" <<<
bouton[0] = new simpleBouton (7);
//bouton[1] = new simpleBouton (8);
bouton[3] = new simpleBouton (9);
//bouton[4] = new simpleBouton (11);
...
Si l'on déclare X variables globales sans les initialiser, le startup initialise automatiquement (section BSS) ces variables à ZERO, un memset(), et cela ne coûte rien.
Si l'on déclare X variables globales en les initialisant, le startup effectue une recopie d'une section constante en FLASH dans la section DATA en RAM.
Cela coûte plus cher, car d'une part cela occupe un espace en FLASH, et d'autre part cela prend du temps.
Cela n'a rien à voir avec le compilateur, seul le code du startup est responsable de l'initialisation des variables globales.