2016-06-28 1 views
1

Ce n'est pas mon problème exact, mais un exemple est comme suitUndefine une directive preprocesser qui est utilisé dans une autre directive préprocesseur

// Method 1 

#define Function(argument) (StupidLongArray[argument] + OtherStupidLongArrayName[argument] * WhyAreMyNamesSoLong[argument]) 

ou préférions

// Method 2 

#define _SLA StupidLongArray 
#define _OSLAN OtherStupidLongArrayName 
#define _WAMNSL WhyAreMyNamesSoLong 

#define Function(argument) (_SLA[argument] + _OSLAN[argument] * _WAMNSL[argument]) 

#undef _SLA 
... 
... 

Ma compréhension de ces directions préprocesseur implique qu'une fois la fonction a été définie, je peux me débarrasser de _SLA et amis. Ce n'est pas le cas.

Comment ça se fait? Est-ce que c'est un moyen de contourner cela?

Répondre

4

Malheureusement, il n'y a aucun moyen de contourner cela. Le traitement du préprocesseur consiste essentiellement à substituer la macro à la ligne d'origine, puis à la retraiter à nouveau. Donc, si vous appelez Function(x), il devient d'abord (_SLA[x] + _OSLAN[x] * _WAMNSL[x]), puis les macros _SLA, _OSLAN et _WAMNSL sont remplacées par la suite. Si elles ne sont pas définies à l'endroit où se produit cette substitution, elles resteront telles quelles.

+0

Ah, je ne voyais pas le processus de substitution de cette manière. Merci pour votre réponse. Je suppose que je vais juste polluer un peu l'espace des noms. Acceptera votre réponse lorsque la minuterie se ferme dessus. – AndrewGrant

0

En plus de la réponse affichée, vous pourriez envisager de réécrire la macro comme:

#define Function(argument)      \ 
    (StupidLongArray[argument]     \ 
    + OtherStupidLongArrayName[argument]  \ 
    * WhyAreMyNamesSoLong[argument]) 

Cette beaucoup plus claire et plus facile à lire que votre version avec courts, les abréviations non-sens. Il peut également être judicieux d'inverser l'ordre d'apparition de sorte que l'opération de multiplication soit placée avant l'addition, pour faciliter la lecture du code. En guise de note, vous devez éviter de donner des noms d'identifiants commençant par _ car cela pourrait entrer en conflit avec les identifiants de bibliothèque.