#define a 100
#define b 200
main()
{
int c=a+b;
}
Après prétraiter
Output-
#define a 100
main()
{
int c=a+200;
}
#define a 100
#define b 200
main()
{
int c=a+b;
}
Après prétraiter
Output-
#define a 100
main()
{
int c=a+200;
}
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.
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
@ 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
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
#define a 100
#define b 200
main()
{
#undef b
int c=a+b;
}
Il ne doit pas incrémenter les numéros de ligne. – user470143
pas vraiment :-) le #define serait pré-traité, mais il le veut dans sa sortie. –
Nope Je suis confus –
Non Quel est votre objectif réel? Si vous voulez faire, il est préférable de faire un script pour le faire.
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;
}
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
....
}
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
J'ai enlevé ma réponse, parce que, après y avoir réfléchi, ça ne marchera pas pour la question posée. –
comment est-ce une question Java? – Jorn
Um ... Java n'a pas de préprocesseur ou de macros. C'est le code C –
Quel est votre objectif avec ceci? – kubi