Comment puis-je afficher la valeur d'un #define au moment de la compilation?
Je suis à essayer de comprendre quelle est la version de Boost mon code pense qu'il utilise. Je veux faire quelque chose comme ceci:
#error BOOST_VERSION
mais le préprocesseur ne pas étendre BOOST_VERSION.
Je sais que je pourrais l'imprimer au moment de l'exécution du programme, et je sais que je pourrais chercher à la sortie du préprocesseur pour trouver la réponse. J'ai l'impression d'avoir un moyen de le faire lors de la compilation pourrait être utile.
- Pour les futurs visiteurs... Chris Barry prévoit la généralisation de la solution à la fin (sans Boost choses spécifiques).
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez Visual C++, vous pouvez utiliser
#pragma message
:Edit: Grâce à LB pour le lien
Apparemment, la GCC est équivalent (pas testé):
BOOST_PP_STRINGIZE
ce qui est agréable et à court et à copier/pasteable.BOOST_PP_STRINGIZE
semble une excellente solution pour le C++, mais pas régulier, C.Voici ma solution pour GNU RPC:
Définitions ci-dessus ont pour conséquence:
Pour ", défini comme le nombre entier", ", défini comme une chaîne de caractères", et "défini mais pas de valeur" variables , ils fonctionnent très bien. Seulement pour "non défini" variable, elles affichent exactement le même que l'original nom de la variable. Vous avez utilisé pour, ou peut-être quelqu'un peut fournir une meilleure solution.
DEFINED_INT=(sizeof(MY_STRUCT))
, sans lesizeof
de l'opérateur en cours d'évaluation.sizeof
, cependant, toujours curieux de savoir si il y a un moyen astucieux de la réalisation de ce.)Je sais que c'est une longue période après la requête d'origine, mais cela peut toujours être utile.
Cela peut être fait dans GCC à l'aide de la stringify opérateur "#", mais il nécessite deux étapes.
La valeur d'une macro peut ensuite être affiché avec:
Voir: 3.4 Stringification de la gcc en ligne de la documentation.
__IPHONE_9_3
.Autant que je sais "#erreur " seulement imprimer des chaînes de caractères, en fait vous n'avez même pas besoin d'utiliser des guillemets.
Avez-vous essayé d'écrire les différents volontairement incorrecte code à l'aide de "BOOST_VERSION"? Peut-être quelque chose comme "bla[BOOST_VERSION] = toto;" vous dira quelque chose comme "littéral de chaîne 1.2.1 ne peut pas être utilisé comme un tableau d'adresses". Il ne sera pas un joli message d'erreur, mais au moins il va vous montrer la valeur correspondante. Vous pouvez jouer jusqu'à ce que vous trouver une erreur de compilation qui ne vous dire la valeur.
std::vector<BOOST_VERSION>;
dans gcc 4.4.1. Merci!Sans boost :
définir la même macro et le compilateur LUI-même de donner l'alerte.
D'avertissement, vous pouvez voir l'emplacement de la définition précédente.
vi fichier de définition précédente .
Fonctionne même si
preprocess to file
est activé, même si invalide jetons sont présents:Build error: #include expects "FILENAME" or <FILENAME>
. Soupir.'
:*** WARNING C318 IN LINE 2 OF test.c: can't open file '::*/`'
Vous pouvez également traiter le fichier source et voir ce que le préprocesseur valeur est évaluée à.
Dans Microsoft C/C++, vous pouvez utiliser le haut-
_CRT_STRINGIZE()
pour imprimer des constantes. Beaucoup de messtdafx.h
fichiers contiennent une combinaison de ces éléments:et sorties à quelque chose comme ceci:
Vous êtes à la recherche pour
Pas génial si BOOST_VERSION est une chaîne de caractères, comme je l'ai supposé, mais il peut aussi être individuelle des entiers définis pour les majeurs, mineurs et les numéros de révision.
#if VARIABLE == 123
déclaration à la volée et la coloration syntaxique me dit que c'est la valeur je pense que c'est ou pas...À la recherche à la sortie du préprocesseur est la chose la plus proche à la réponse que vous demandez.
Je sais que vous avez exclu que (et d'autres moyens), mais je ne sais pas pourquoi. Vous avez une assez de problème à résoudre, mais vous n'avez pas expliqué pourquoi la "normale" méthodes ne fonctionnent pas bien pour vous.
Vous pouvez écrire un programme qui affiche
BOOST_VERSION
et de le compiler et de l'exécuter en tant que partie de votre système de construction. Sinon, je pense que vous êtes hors de la chance.BOOST_VERSION est défini dans l'élan de l'en-tête de la version de fichier.hpp.
Prendre un coup d'oeil à la poussée de la documentation ainsi, concernant la façon dont vous utilisez la macro:
En référence à
BOOST_VERSION
, de http://www.boost.org/doc/libs/1_37_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.boost_helper_macros: