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?

Andrew Wagner
la source

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!" )
Tu
la source
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.

Matt Joiner
la source
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!")

Ruel
la source
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.

nos
la source
6
#pragma message("foo")

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

Martin
la source
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 .

Aaron Digulla
la source
-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.

Alexander Rafferty
la source
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