10.5 Le programme

Faisons un exemple :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

using namespace std;

int main (int argc, char** argv) {
	
#ifdef MACROTEST
	cout << "La macro MACROTEST existe." << endl;
	cout << "Sa valeur est : " <<  MACROTEST <<  endl;
#else
	cout << "La macro MACROTEST n'existe pas." << endl;
#endif
	
	return 0;
}

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.