Comment afficher la valeur d'un # define au moment de la compilation dans gcc

Jusqu'à présent, j'ai autant que:

#define ADEFINE "23"
#pragma message ("ADEFINE" ADEFINE)

Qui fonctionne, mais que faire si ADEFINE n'est pas une chaîne?

#define ADEFINE 23
#pragma message ("ADEFINE" ADEFINE)

Causes:

Avertissement: message#pragma mal formé, ignoré

Idéalement, j'aimerais pouvoir gérer n'importe quelle valeur, y compris undefined.

22
demandé sur Brian Tompsett - 汤莱恩 2012-03-14 04:24:53

2 réponses

Pour afficher des macros qui ne sont pas des chaînes, stringify la macro :

#define STRINGIFY(s) XSTRINGIFY(s)
#define XSTRINGIFY(s) #s

#define ADEFINE 23
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE))

Si vous voulez boost, vous pouvez utiliser boost stringize pour le faire pour vous:

#include <boost/preprocessor/stringize.hpp>
#define ADEFINE 23
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE))
24
répondu rob05c 2012-03-14 02:27:57

Je ne suis pas sûr si cela fera ce que vous voulez, mais si cela vous intéresse seulement pour déboguer le problème de macro occasionnel (donc ce n'est pas quelque chose dont vous avez besoin affiché dans un message pour chaque Compilation), ce qui suit peut fonctionner pour vous. Utilisez l'option -E -dD de gcc pour vider les directives #define avec la sortie de prétraitement. Puis dirigez-le à travers grep pour voir uniquement les lignes que vous voulez:

// test.c
#include <stdlib.h>
#include <stdio.h>
#define ADEFINE "23"
#include <string.h>

int main(int argc, char *argv[])
{
#undef ADEFINE
#define ADEFINE 42
    return 0;
}

La commande gcc -E -dD -c test.c | grep ADEFINE affiche:

#define ADEFINE "23"
#undef ADEFINE
#define ADEFINE 42
6
répondu Michael Burr 2012-03-14 00:50:50