2010-10-13 2 views

Répondre

1

Vous pouvez essayer refactorisation les macros permettre la configuration externe, c.-à-

/* config.h */ 

/* set defaults for a and b */ 
#ifndef a 
#define a 100 
#endif 

#ifndef b 
#define b 200 
#endif 

et

/* main.c */ 

#include "config.h" 

int main(void) 
{ 
    int c = a + b; 
} 

T orsque vous pouvez définir les macros à l'extérieur lors de la construction, par exemple comme ceci:

$ gcc -E -Da=a main.c 
# 1 "main.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "main.c" 


# 1 "config.h" 1 
# 4 "main.c" 2 

int main(void) 
{ 
    int c = a + 200; 
} 
$ gcc -E -Db=b main.c 
# 1 "main.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "main.c" 


# 1 "config.h" 1 
# 4 "main.c" 2 

int main(void) 
{ 
    int c = 100 + b; 
} 

Maintenant, bien sûr, vous ne pas ont d'utiliser un en-tête de configuration séparée, mais je le recommande du point de vue de l'entretien Cela facilitera le suivi des paramètres de configuration disponibles et de leurs paramètres par défaut.

+0

Merci pour votre reply.Can vous s'il vous plaît me dire comment ça marche? et la valeur de macro reste-t-elle la même? – user470143

+1

@ user470143 Um, avec la configuration externe, vous définissez la macro 'a' comme étant littérale 'a'. En utilisant un préprocesseur plus simple comme unifdef ou Coan avec le refactoring suggéré, vous pouvez faire précisément la transformation du code source que vous recherchez. (Le préprocesseur GCC ajoute des trucs supplémentaires, comme vous pouvez le voir dans la sortie ci-dessus) – Christoffer

+0

Un autre problème dont je veux discuter est que je ne veux pas changer le nombre de lignes dans le fichier C.Dans cette réponse, je dois faire des changements #define 100 dans #ifndef un #define 100 #endif si le numéro de ligne dans le code source obtenir augmenté. – user470143

0
#define a 100 
#define b 200 
main() 
{ 
#undef b 
int c=a+b; 
} 
+0

Il ne doit pas incrémenter les numéros de ligne. – user470143

+0

pas vraiment :-) le #define serait pré-traité, mais il le veut dans sa sortie. –

+0

Nope Je suis confus –

0

Non Quel est votre objectif réel? Si vous voulez faire, il est préférable de faire un script pour le faire.

0

Si vous ne voulez pas prétraiter une macro, juste ne l'utilisez pas:

#define a 100 
//#define b 200 

int main() 
{ 
    int c = a + 200; 

    return 0; 
} 
0

Le but de pré-traitement est de traiter les directives de pré-traitement. Je ne connais aucun moyen de conserver une directive de prétraitement spécifique, d'autant plus que la prochaine étape, la compilation, n'en sait rien.

C'est une autre raison pour laquelle vous devez être prudent lors de l'utilisation des macros - lorsque le nom se trouve dans la source, il est substitué, peu importe:

#define a 100 

main() 
{ 
    int a; // Compilation error happens here 
    .... 
} 
0

En ce qui concerne la réponse de Peter Miehle, unifdef peut être utilisé pour traiter partiellement les directives #if et #ifdef, mais il ne peut pas être utilisé pour développer de manière sélective des macros. Voir http://dotat.at/prog/unifdef

+0

J'ai enlevé ma réponse, parce que, après y avoir réfléchi, ça ne marchera pas pour la question posée. –

Questions connexes