web-dev-qa-db-fra.com

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

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?

76
Andrew Wagner

La directive warning 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!"

Autant que je sache, cela fonctionne sur la plupart des compilateurs sauf MSVC, sur lequel vous devrez utiliser une directive pragma:

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

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

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

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

45
Matt Joiner

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

10
Ruel

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

 #warning "Got here"

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

 #error "Got here"

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

7
nos
#pragma message("foo")

fonctionne très bien. Aussi, n'arrêterait pas la compilation même si vous utilisiez -Werror

5
Martin

Une autre solution consiste à utiliser des commentaires et un script Shell pour les traiter. Cela nécessite une certaine discipline (ou un script Shell qui capture des fautes de frappe).

Par exemple, j'ajoute des commentaires au format //TODO, puis un script Shell qui les rassemble dans un rapport.

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

0
Aaron Digulla