Existe-t-il un moyen portable d'imprimer un message à partir du préprocesseur C?


99

J'aimerais pouvoir faire quelque chose comme

#print "C Preprocessor got here!"

à des fins de débogage. Quelle est la meilleure façon / la plus portable de faire cela?

Réponses:


115

La warningdirective est probablement la plus proche que vous obtiendrez, mais elle n'est pas entièrement indépendante de la plate-forme:

#warning "C Preprocessor got here!"

AFAIK cela fonctionne sur la plupart des compilateurs sauf MSVC, sur lequel vous devrez utiliser une pragmadirective:

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

5
Ce qui soulève la question, pouvez-vous mettre une directive basée sur un indicateur de compilation pour permuter d'une manière ou d'une autre "message pragma" et "avertissement"? Par exemple, quelque chose comme: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... Je vais devoir essayer mais l'instinct me dit que la réponse est non.
Bryan

11
@Bryan: Oui. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner

1
#pragma message () n'est pas pris en charge par les anciennes versions de gcc (comme gcc 4.1.2, la version par défaut sur RHEL5). Je n'ai pas encore trouvé d'é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 la compilation.
Danny S

6
L'émission d'un avertissement est très gênant lorsque votre projet se compile avec -Wall par défaut. Le message #pragma n'a pas ce problème.
Renan Gemignani

56

Les éléments suivants sont pris en charge par MSVC et GCC .

#pragma message("stuff")
#pragma message "stuff"

Clang a récemment commencé à ajouter un support, voir ici pour plus.


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

Fonctionne avec Arduino 1.8 en utilisant Visual Studio vMicro. Merci!
save_jeff

12

Vous voudrez peut-être essayer: #pragma message("Hello World!")


9

La plupart des compilateurs C reconnaissent une #warningdirective, donc

 #warning "Got here"

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

 #error "Got here"

Bien que tous les compilateurs prennent en charge cela, cela arrêtera également la compilation / le prétraitement.


6
#pragma message("foo")

fonctionne très bien. N'arrêterait pas non plus la compilation même si vous utilisez -Werror


0

Une autre solution consiste à utiliser des commentaires et un script shell pour les traiter. Cela demande une certaine discipline (ou un script shell qui détecte les fautes de frappe).

Par exemple, j'ajoute des commentaires formatés //TODOpuis un script shell qui les rassemble tous dans un rapport.

Pour des cas d'utilisation plus complexes, vous pouvez essayer d'écrire votre propre préprocesseur simple. Par exemple, vous pouvez modifier vos sources sous forme de *.c2fichiers. Le préprocesseur simple lit la source, recherche //TODOet écrit printf("TODO ...")dans le *.cfichier de sortie .


-17

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 à 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.

Quelque chose ne va pas avec:

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

Parce que c'est tout ce que vous pouvez faire en ce qui concerne les préprocesseurs.


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

J'ai supposé qu'il voulait dire l'impression au moment de l'exécution.
Alexander Rafferty

1
Je demandais à propos de la compilation. Merci!
Andrew Wagner
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.