2010-05-08 3 views
13

Je devine de # que c'est seulement un utilitaire de compilation. Comment peut-il être utilisé dans les programmes C/C++?Comment fonctionne #error en C/C++?

Je n'en ai pas trouvé grand-chose sur Internet. Tous les liens seraient utiles.

Répondre

12

Cela provoque le compilateur (ou le préprocesseur) pour sortir le message d'erreur. En C++, il rend également l'unité de traduction mal formée (c'est-à-dire qu'elle provoque l'échec de la compilation).

Si vous avez plusieurs macros qui peuvent être définies et que vous voulez être sûr que seules certaines combinaisons d'entre elles sont définies, vous pouvez utiliser #error pour provoquer l'échec de la compilation si une combinaison incorrecte est définie.

Cela peut également être utile si vous voulez être sûr qu'un bloc de code n'est jamais compilé (pour quelque raison que ce soit).

+1

que voulez-vous dire par "seulement certaines combinaisons de macros sont définies". Pouvez-vous citer un exemple? Merci. – Moeb

+0

@cambr: Par exemple, si vous avez deux macros, 'DO_X' et' DO_Y' et que vous voulez vous assurer qu'un seul est défini à la fois, vous pouvez envelopper une directive '# error 'dans un #if (DO_X défini) && (défini DO_Y) 'bloc. –

+5

@cambr: Supposons que votre société vend Slicer ™ et Dicer ™. Les deux produits utilisent 'blade.c', mais ils passent des macros différentes à travers le système de construction pour des fonctionnalités légèrement différentes. Ensuite, vous pouvez utiliser '#if SLICING ... #elif DICING ... #else #error Aucune fonctionnalité sélectionnée par makefile.' – Potatoswatter

2

Voici un lien vers la documentation du préprocesseur Gnu expliquant les #error et #warning directives: http://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html

En particulier:

La directive #error provoque la préprocesseur signaler une erreur fatale. Les jetons formant le reste de la ligne suivant #error sont utilisés comme le message d'erreur.

Voir aussi this question à propos de la portabilité de ces directives.

+4

La directive' # error' fait partie des standards de langage C et C++ et est entièrement portable. '# warning' est une extension de langage spécifique à gcc. –

+0

@james, merci pour la clarification. – UncleZeiv

9

Utile pour vérifier les paramètres du compilateur ainsi que pour vérifier les combinaisons de valeurs macro. Quelques exemples aléatoires:

#if !defined(_DLL) 
# error This code will only work properly when compiled with /MD 
#endif 

#if _WIN32_WINNT < 0x502 
# error Sorry, Windows versions prior to XP SP2 are not supported 
#endif 

#if defined(_APPLE) && defined(_LINUX) 
# error Conflicting operating system option selected, choose one. 
#endif 
+0

Traitez-vous vraiment le dernier en pratique? N'est-ce pas la responsabilité de l'utilisateur de ne pas être braindead et ne pas utiliser des drapeaux de compilateur sans signification? Vous ne pouvez pas vérifier * tout * ... – Thomas

+3

C'est juste un exemple. Vous avez tendance à ajouter ces éléments lorsque vous avez un appel de support en trop. Boost est très répandue avec par exemple. –