web-dev-qa-db-fra.com

Comment annuler la définition d'une ligne de commande à l'aide de gcc

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

}
38
monkeyking

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.

45
dcp

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 ...

13
par

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.

10
jldupont

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.

1
Pankaj Saraf

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.

1
xryl669

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.

0
Roland Sarrazin