12
votes

Nom d'impression et valeur d'une macro

J'ai un programme C avec beaucoup d'optimisations pouvant être activées ou désactivées avec #define s. Lorsque je gère mon programme, j'aimerais savoir quelles macros ont été définies lors de la compilation.

Donc, j'essaie d'écrire une fonction macro pour imprimer la valeur réelle d'une macro. Quelque chose comme ça: xxx

Cependant, je ne sais pas comment le faire fonctionner et je soupçonne que ce n'est pas possible, quelqu'un a-t-il une idée de la façon de le faire?

(Notez que cela doit compiler même lorsque la macro n'est pas définie!)


1 commentaires

Connexes, au cas où vous êtes ici à la recherche de quelque chose d'autre: si vous voulez simplement savoir que les macros indiquent que les en-têtes standard définissent, non réellement que votre programme les imprime, voir Liste C constantes / macros pour des trucs similaires à GCC -DM et Comment trouver la source de certaines macros


11 Réponses :


2
votes
#ifdef MYMACRO
  printf("MYMACRO defined: %d\r\n", MYMACRO);
#endif
I don't think what you are trying to do is possible. You are asking for info at runtime which has been processed before compilation. The string "MYMACRO" means nothing after CPP has expanded it to its value inside your program.

1 commentaires

Eh bien, c'est ce que j'aimerais éviter, car j'en ai beaucoup avec #Ifdef #else #endif.



4
votes

Écrire une macro qui se développe à une autre macro nécessiterait que le préprocesseur fonctionne deux fois dessus.
Cela n'est pas fait.

Vous pouvez écrire un fichier simple, xxx

Utilisez le même temps de compilation définir des lignes sur ce fichier comme avec les autres fichiers.
Appelez la fonction parfois au début.

Si vous avez les lignes #define dans un fichier source plutôt que le fichier Makefile Déplacez-les vers un autre fichier fichier et incluez cet en-tête sur tous les fichiers source,
Y compris ceci check-définir.c .

Espérons que vous avez le même ensemble de définition autorisée sur tous vos fichiers source.
Sinon, il serait prudent de revérifier la stratégie de vos définitions.


à Automatie génération de cette fonction ,
Vous pouvez utiliser le m4 macro language (ou même un script awk en fait).
m4 devient votre pré-pré-pré-pré-processeur.


1 commentaires

Accepté pour la réponse M4. Cela devient facile lorsque vous ajoutez une autre étape de prétraitement. J'ai fait show_define (x, y, z ...) qui est encore meilleur. Cependant, cela fait Sens parce que j'ai besoin de M4 pour d'autres trucs.



2
votes

Vous n'avez pas spécifié le compilateur que vous utilisiez. S'il s'agit de GCC, GCC -E peut vous aider, car il s'arrête après la phase de prétraitement et imprime le résultat du prétraitement. Si vous diffusez un résultat GCC -E avec le fichier d'origine, vous pouvez faire partie de ce que vous voulez.


0 commentaires

2
votes

Pourquoi ne pas simplement le tester avec le préprocesseur?

 #if define(SHOW_DEFINE)
 #if defined(X)
      printf("%s is defined and as the value %d\n", #X, (int)X);
 #else
      printf("%s is not defined\n", #X);
 #endif
 #endif


2 commentaires

@Philippe, eh bien, c'est ce que je semble avoir suggéré. Mais il veut éviter d'écrire tout cela, c'est pourquoi je suggère des scripts M4 ou Awk.


C'est ce que je fais maintenant, la liste n'est jamais à jour et elle a besoin d'un fichier spécial juste à cet effet :(




1
votes

Je crois ce que vous essayez de faire n'est pas possible. Si vous êtes capable de changer votre travail code> #define code> S, alors je suggère quelque chose comme ceci:

#define ON 1
#define OFF 2

#define OPTIMIZE_FOO ON
#define OPTIMIZE_BAR OFF

#define SHOW_DEFINE(val)\
    if(val == ON) printf(#val" is ON\n");\
    else printf(#val" is OFF\n");


0 commentaires

1
votes

Ce n'est pas possible, le problème étant la partie "non définie". Si vous vous êtes invoqué sur les valeurs de macro pour activer / désactiver des parties de votre code, vous pouvez simplement faire:

#define SHOW_DEFINE(X) \
do { \
if (X > 0) \
    printf("%s %d\n", #X, (int)X);   \
else \
    printf("%s not defined\n", #X);   \
} while(0)


0 commentaires

29
votes

Tant que vous êtes prêt à supporter le fait que surstring = saletring indique que SAVESPRING n'a pas été défini (le considérer comme le jeton n'a pas été redéfini!?!), alors les suivants doivent faire:

BERT=BERT
CHARLIE=-6
FRED=1
HARRY=1
NORBERT=ON_HOLIDAY
WALLY=


0 commentaires

1
votes

Basé sur ChristiRis, répondez je faisais cela. Bien que ma réponse ne soit pas très gentille, c'est tout ce que je voulais. xxx

Seuls bug J'ai trouvé est que la définition ne doit pas être #define xxx xxx (avec xxx égale à xxx).


0 commentaires

0
votes

Cette question est très proche de macro qui imprime une expression et l'évalue (avec __string) . La réponse de ChristiRris est très proche de la réponse à la question précédente.


0 commentaires

0
votes

Vous pouvez utiliser une variable entière initialisée à 1. Multipliez la #define avec cette variable et imprimez la valeur de la variable.


0 commentaires