| ||||
Faisons un exemple :
Compilons sans définir de macro : g++ -Wall main.cpp -o test Testons : ./test La macro MACROTEST n'existe pas. Jusque là, ça se tient. Essayons en définissant la macro : g++ -Wall main.cpp -DMACROTEST -o test Exécutons le programme : ./test La macro MACROTEST existe. Sa valeur est : 1 Mais on a pas donné de valeur à la macro pourtant. Et oui, mais quand on définit une macro sans lui donner de valeur, elle prend la valeur 1. Donnons une valeur à cette macro : g++ -Wall main.cpp -DMACROTEST=42 -o test Regardons le résultat : ./test La macro MACROTEST existe. Sa valeur est : 42 Tout fonctionne, car l'opérateur << gère la conversion des types. Passons une chaîne de caractère : g++ -Wall main.cpp -DMACROTEST="\"Hello breakfast...\"" -o test Vous vous rappelez de ce que l'on avait fait pour passer des chaînes de caractères compliquées à notre programme, et bien c'est le même principe pour les macros. Testons : ./test La macro MACROTEST existe. Sa valeur est : Hello breakfast... Ça fonctionne. Essayons sans définir les guillemets dans les guillemets : g++ -Wall main.cpp -DMACROTEST="Hello breakfast..." -o test main.cpp: In function ‘int main(int, char**)’: main.cpp:10:33: erreur: ‘Hello’ was not declared in this scope main.cpp:10:33: erreur: expected ‘;’ before ‘breakfast’ Ça y est le compilateur n'est pas content, et comme le compilateur à toujours raison, c'est de notre faute. Comme il râle en trois lignes on va faire le détail : Tout à gauche vous avez le fichier qui a une erreur (en même temps il n'y en a qu'un) : main.cpp. Si il y a des nombres après ce sont respectivement la ligne et la colonne de l'erreur (on peut difficilement être plus précis). En ce qui nous concerne il nous dit : À la première ligne : main.cpp: In function ‘int main(int, char**)’: Il y a une erreur dans la fonction int main(int, char**) du fichier main.cpp. À la deuxième ligne : main.cpp:10:33: erreur: ‘Hello’ was not declared in this scope La variable Hello à la ligne 10 colonne 33 du fichier main.cpp n'a pas été déclarée (en gros il ne la connaît pas). Comment il ne la connaît pas, on vient de la passée en paramètre. Oui, mais comme on a pas mis de guillemets (\") dans la déclaration, le compilateur croix que ce sont des fonctions, évidement ce n'est pas ce que nous voulions faire, mais comme le compilateur n'est pas au courrant il râle. À la troisième ligne : main.cpp:10:33: erreur: expected ‘;’ before ‘breakfast’ Il nous dit qu'il attend un point-virgule là où il y a une erreur. C'est une proposition de correction, ce n'est pas forcément la bonne solution. D’ailleurs dans notre cas, ce n'est pas la bonne solution. | ||||
|