compilation conditionnelle gcc

J’apprends la compilation conditionnelle et je pense que j’ai bien compris jusqu’à présent. Maintenant, si j’ai le code:

#ifdef UMP_TO_FILE //do something here... #endif 

et je cours:

  gcc myprogram.c -DUMP_TO_FILE 

Ensuite, le bloc de code “// faire quelque chose ici …” est compilé. Maintenant, ma question est la suivante:

Que fait exactement le drapeau -DUMP_TO_FILE?

Je pense que le drapeau est “-D” et il définit la macro “UMP_TO_FILE”, mais je veux être sûr de la syntaxe et “gcc –help” ne me dit rien et peut-être que je ne sais pas comment pour rechercher cela sur Internet !!

Merci beaucoup de partager vos connaissances!

La sortie de man gcc contient ce petit extrait:

-D nom

name prédéfini en tant que macro, avec la définition 1.

-D name = définition

Le contenu de la définition est segmenté et traité comme s’il apparaissait lors de la phase trois de la traduction dans une directive #define . En particulier, la définition sera tronquée par les caractères de nouvelle ligne incorporés.

Si vous appelez le préprocesseur à partir d’un shell ou d’un programme de type shell, vous devrez peut-être utiliser la syntaxe de citation du shell pour protéger des caractères tels que des espaces qui ont un sens dans la syntaxe du shell.

Si vous souhaitez définir une macro de type fonction sur la ligne de commande, écrivez sa liste d’arguments avec les parenthèses environnantes avant le signe égal (le cas échéant). Les parenthèses ont un sens pour la plupart des shells, vous devrez donc citer l’option. Avec sh et csh , -D'name(args...)=definition' fonctionne.

-D options -D et -U sont traitées dans l’ordre indiqué sur la ligne de commande. Toutes les -imacros file et -include sont traitées après toutes les options -D et -U .

Donc, l’option -DUMP_TO_FILE équivaut à mettre la ligne #define UMP_TO_FILE 1 dans votre code source (il y a des différences subtiles mais il n’est pas nécessaire de les couvrir ici).


En passant, je considère cette pratique plutôt mauvaise. L’auteur effectue une supercherie afin qu’il ressemble à une option de compilation DUMP_TO_FILE plutôt qu’à une macro de pré-processeur. C’est un peu malin mais cela va causer des problèmes à ceux qui regardent la source en se demandant ce UMP_TO_FILE signifie réellement UMP_TO_FILE .

Personnellement, je préférerais voir -DDUMP_TO_FILE et #ifdef DUMP_TO_FILE car son intention est beaucoup plus claire.

 -D UMP_TO_FILE 

Définit la valeur de macro UMP_TO_FILE. C’est comme mettre dans votre code la ligne suivante:

 #define UMP_TO_FILE 

Si la valeur (UMP_TO_FILE) est définie, les lignes de code entre #ifdef et #endif seront compilées. Sinon pas.

-d définit un symbole. Je crois que la plupart des compilateurs autoriseront également l’atsortingbution d’une valeur au symbole, car dans -dfoo=bar atsortingbue la barre au symbole foo.

De http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options

-D nomme le nom de Predefine en tant que macro, avec la définition 1.

-D nom = définition Le contenu de la définition est segmenté et traité comme s’il était apparu lors de la phase de traduction trois dans une directive “#define”. En particulier, la définition sera tronquée par les caractères de nouvelle ligne incorporés. Si vous appelez le préprocesseur à partir d’un shell ou d’un programme de type shell, vous devrez peut-être utiliser la syntaxe de citation du shell pour protéger des caractères tels que des espaces qui ont un sens dans la syntaxe du shell.

Si vous souhaitez définir une macro de type fonction sur la ligne de commande, écrivez sa liste d’arguments avec les parenthèses environnantes avant le signe égal (le cas échéant). Les parenthèses ont un sens pour la plupart des shells, vous devrez donc citer l’option. Avec sh et csh, -D’name (args …) = definition ‘fonctionne.

Les options -D et -U sont traitées dans l’ordre indiqué sur la ligne de commande. Toutes les options -imacros file et -include sont traitées après toutes les options -D et -U.