Est-il un moyen de vérifier une macro est définie et elle est égale à une certaine valeur en même temps

J'utilise régulièrement l'objet-comme les macros du préprocesseur comme booléenne drapeaux dans C code pour allumer et éteindre les sections de code.

Par exemple

#define DEBUG_PRINT 1

Et de l'utiliser ensuite comme

#if(DEBUG_PRINT == 1)
    printf("%s", "Testing");
#endif

Cependant, il s'agit d'un problème si le fichier d'en-tête qui contient le #define est oublié pour être inclus dans le code source. Depuis la macro n'est pas déclaré, le préprocesseur la traite comme si elle est égale à 0, et le #if déclaration ne s'exécute.

Lorsque le fichier d'en-tête est oublié pour être inclus, non prévu, unruly comportement peut se produire.

Idéalement, je voudrais être capable à la fois de vérifier qu'une macro est définie, et vérifiez qu'il est égal à une certaine valeur, dans une ligne. Si elle n'est pas définie, le préprocesseur renvoie une erreur (ou avertissement).

Je suis à la recherche de quelque chose le long des lignes de:

#if-def-and-true-else-throw-error(DEBUG_PRINT)
    ...
#endif

C'est comme une combinaison de #ifdef et #if, et si elle n'existe pas, utilise #error.

J'ai exploré quelques pistes, toutefois, les directives de préprocesseur ne peut pas être utilisé à l'intérieur d'un #define bloc, et autant que je sache, il n'est pas de préprocesseur option pour générer des erreurs/avertissements si une macro n'est pas définie lorsque utilisé à l'intérieur d'un #if déclaration.

Le compilateur ne peut pas vous sauver de tout...
La droite. Alors ce que vous voulez est d'envelopper votre print fonction dans une macro ou une autre fonction, plutôt que d'habillage à l'ensemble de l'appel d'emplacements. Ensuite, vous pouvez consolider l'erreur de génération de code dans un seul endroit plutôt que d'essayer de le saupoudrer sur votre projet.
Vous pouvez tout aussi facilement oublier d'utiliser #if-def-and-true-else-throw-error(DEBUG_PRINT) au lieu de #if DEBUG_PRINT == 1, de sorte que même si cette fonction existait, il ne serait pas obtenir quelque chose d'utile.
Si vous avez défini PrintDebug dans le fichier d'en-tête, qui est l'endroit logique pour elle, alors le code ne compile pas si le fichier d'en-tête n'est pas inclus.
gcc dispose d'une option (-Wundef) pour générer un message d'avertissement lorsqu'un non défini identifiant est évalué dans un #if directive.

OriginalL'auteur gbmhunter | 2013-06-18