2010-09-30 17 views

Répondre

72

La directive warning est probablement le plus proche, vous aurez, mais il est pas tout à fait plate-forme indépendante:

#warning "C Preprocessor got here!" 

AFAIK cela fonctionne sur la plupart des compilateurs sauf MSVC, sur lequel vous devrez utiliser un pragma directive:

#pragma message ("C Preprocessor got here!") 
+5

Qui pose la question, pouvez-vous mettre une directive basée sur un drapeau de compilation pour échanger "message pragma" et "avertissement" en quelque sorte? Par exemple, quelque chose comme: '#ifdef _LINUX #define #preprocmsg" #warning "else #define #preprocmsg" #pragma message "' ... Je vais devoir essayer ça mais l'instinct me dit que la réponse est non. – Bryan

+6

@Brian: Oui. '#define WARNING (msg) _Pragma (" message "#msg)' –

+1

#pragma message() n'est pas supporté par les anciennes versions de gcc (comme gcc 4.1.2, la version par défaut sur RHEL5). Je n'ai pas encore trouvé un équivalent approprié pour ces anciennes versions - #warning ne va pas être génial, car les avertissements sont traités comme des erreurs pour nous en général, et nous aimerions vraiment que le message soit informatif, plutôt que d'arrêter le compilation. –

-16

Vous ne pouvez pas. Les préprocesseurs sont traités avant le code C. Il n'y a pas de directives de préprocesseur à imprimer sur l'écran, car le code du préprocesseur n'est pas exécuté, il est utilisé pour générer le code C qui sera compilé en code exécutable.

ya un problème avec:

#ifdef ... 
printf("Hello"); 
#endif 

Parce que c'est tout ce que vous pouvez faire autant que préprocesseurs aller.

+5

Cela ne s'imprimera pas au moment de la compilation, ce que je pense qu'OP recherche. –

+0

J'ai supposé qu'il voulait dire l'impression à l'exécution. –

+1

Je demandais à propos de la compilation. Merci! –

10

Vous pouvez essayer: #pragma message("Hello World!")

40

Les éléments suivants sont pris en charge par MSVC et GCC. Clang a commencé à ajouter du support récemment, voir here pour plus d'informations.

+0

Pour mémoire, Solaris Studio 12.3 (Sun C 5.12) ne prend pas en charge ce pragma. – maxschlepzig

7

La plupart des compilateurs C reconnaîtront une directive #warning, si

#warning "Got here" 

Il y a aussi la directive '#error' standard,

#error "Got here" 

Alors que tous les compilateurs soutiennent que, il va également arrêter la compilation/pré-traitement.

5
#pragma message("foo") 

fonctionne très bien. Également n'arrêterait pas la compilation même si vous utilisez -Werror

-1

Une autre solution consiste à utiliser des commentaires plus un script shell pour les traiter. Cela prend une certaine discipline (ou un script shell qui attrape les fautes de frappe). Par exemple, j'ajoute des commentaires au format //TODO puis un script shell qui les rassemble tous dans un rapport. Par exemple, j'ajoute des commentaires au format //TODO.

Pour les cas d'utilisation plus complexes, vous pouvez essayer d'écrire votre propre préprocesseur simple. Par exemple, vous pouvez modifier vos sources en tant que fichiers *.c2. Le préprocesseur simple lit la source, recherche //TODO et écrit printf("TODO ...") dans le fichier de sortie *.c.