Comment compiler une macro de compilation à l’aide de gcc au moment de la compilation? J'ai essayé quelques arguments de compilation pour gcc comme -D mais je n'arrive pas à voir le message "non défini".
Merci
#include <iostream>
#define MYDEF
int main(){
#ifdef MYDEF
std::cout<<"defined\n";
#else
std::cout<<"not defined\n";
#endif
}
Vous pouvez utiliser l'option -U avec gcc, mais cela ne déterminera pas une macro définie dans votre code source. Autant que je sache, il n'y a aucun moyen de le faire.
Vous devez envelopper la définition MYDEF
dans une macro de préprocesseur dont la présence (définie sur la ligne de commande) empêcherait alors la définition de MYDEF. Un peu compliqué pour être sûr, mais vous pouvez ensuite contrôler la construction comme vous le souhaitez depuis la ligne de commande (ou Makefile). Exemple:
#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif
Ensuite, à partir de la ligne de commande lorsque vous ne voulez pas MYDEF:
gcc -DDONT_DEFINE_MYDEF ...
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Preprocessor-Options.html#Preprocessor-Options
Les options -U
semblaient être ce dont vous auriez besoin ... mais vous ne pouvez pas remplacer une définition contenue dans votre code source sans recourir à davantage de directives de préprocesseur.
Le cas d'utilisation du code n'est pas correct. Comme je le vois, vous avez #define
codé en dur dans le fichier. Si le compilateur suppose initialement MYDEF
undefined, il le définira dès qu’il commencera à traiter le fichier.
Vous devez supprimer la ligne #define MYDEF
. Et j'espère que votre scénario de test fonctionnera si vous passez de MYDEF
à -D
et -U
.
Vous pouvez recourir au filtrage du code source et le redonner à gcc pour la compilation, comme ce pseudo-code:
grep -v "define MYDEF" yourFile.c | gcc -o yourFile.o -xc -
J'espère que ça aide.
Voici une possibilité qui ne couvre pas complètement votre cas d'utilisation mais que j'ai trouvée utile dans mon cas.
Si votre MYDEF
était #defined dans un fichier d'en-tête séparé #included du fichier .c, vous pouvez forcer la définition de la macro #include guard avec l'option -D
(empêchant ainsi la MYDEF
#definition), soit activement -D
option) MYDEF
à quelque chose d'autre ou laissez-le simplement non défini.
Il est clair que tout ce qui est défini dans le fichier d’en-tête serait également manquant, mais c’était pour moi une solution permettant de définir de manière forcée une macro sans modifier le code tiers.