2010-11-01 5 views
3


J'ai une question sur l'utilisation de #undef pour redéfinir des macros.
J'ai un fichier global.h qui contient un certain nombre de # macros define-d. Dans le code qui utilise ces macros, je trouve que les valeurs que contiennent les macros ne sont pas assez génériques. Je veux redéfinir les macros pour les rendre plus génériques. J'ai écrit l'extrait de code suivant pour faire exactement cela:portée de #undef C++

std::cout << endl << "Enter pitch threshold:" << endl; 
std::cin >> pitchT; 
#ifdef PitchThreshold 
    #undef PitchThreshold 
    #define PitchThreshold pitchT 
    #endif 

Mes questions sont les suivantes:
Est-ce que l'aide d'un #undef de cette manière d'assurer la redéfinition de la macro dans tous les fichiers source, ou est-ce à la fonction locale où les lignes de code ci-dessus sont écrites? Quelle est la portée des opérateurs #undef et #define?
Que puis-je faire (en dehors de la modification des macros dans le fichier où ils sont # define-d lui-même) pour assurer que les définitions de macro sont modifiées dans tous les fichiers source?
Merci,
Sriram

Répondre

9

#ifdef est une directive préprocesseur, cela signifie qu'il sera appliqué avant que votre code source est compilé. Cela signifie que seul le code source "ci-dessous" sera affecté. Si vous exécutez votre code source via le préprocesseur, vous pourrez voir le résultat. Cela vous donnera plus de perspicacité dans le fonctionnement du préprocesseur.

+0

mais l'opérateur #undef a-t-il quelque chose à voir avec la valeur avec laquelle il est redéfini? Par exemple, dans l'extrait de code ci-dessus, pitchT est un int qui est local à la fonction où cette redéfinition a lieu. Quand pitchT est hors de portée, cela affecte-t-il l'instruction #define? – Sriram

+3

Vous ne pouvez pas modifier la valeur d'une macro au moment de l'exécution. Le préprocesseur ne fait que des substitutions textuelles, donc la prochaine fois que 'PitchThreshold' est utilisé dans votre code, il est remplacé par' pitchT' (le nom de la variable, pas sa valeur). –

+0

c'était la réponse que je cherchais! merci les larsmans! Je pensais que #define remplacerait pitchT par sa valeur. – Sriram

1

La portée de l'opérateur #undef est le fichier entier après son appel. Cela inclut tous les fichiers qui l'incluent (parce que le préprocesseur enchaîne simplement les fichiers ensemble.) Parce qu'il fait partie du préprocesseur, il n'a pas de choses étranges comme la portée.

+0

mais l'opérateur #undef a-t-il quelque chose à voir avec la valeur avec laquelle il est redéfini? Par exemple, dans l'extrait de code ci-dessus, pitchT est un int qui est local à la fonction où cette redéfinition a lieu. Quand pitchT est hors de portée, cela affecte-t-il l'instruction #define? – Sriram

+0

Tout l'opérateur '#define A B' remplace-t-il toutes les instances de A par B. Vous pouvez faire' #define INFLOOP while (true) {} 'et le préprocesseur va le remplacer. Le préprocesseur effectue simplement des opérations sur le texte, il est complètement indépendant du langage C. Dans le contexte du code que vous avez posté, votre question n'a aucun sens car il n'y a aucun texte qui est remplacé. "PitchThreshold" n'apparaît pas dans votre code C. – OmnipotentEntity

+0

PitchThreshold est le "nom" d'une macro définie dans un fichier appelé global.h mais redéfinie ici dans un fichier appelé phrase.C. Si pitchThreshold n'apparaît pas, c'est parce que je n'ai pas posté le code entier. – Sriram