Czy istnieje przenośny sposób drukowania wiadomości z preprocesora C?

99

Chciałbym móc zrobić coś takiego

#print "C Preprocessor got here!"

do celów debugowania. Jaki jest najlepszy / najbardziej przenośny sposób na zrobienie tego?

Andrew Wagner
źródło

Odpowiedzi:

115

warningDyrektywa jest chyba najbliżej dostaniesz, ale to nie jest całkowicie niezależny od platformy:

#warning "C Preprocessor got here!"

AFAIK to działa na większości kompilatorów z wyjątkiem MSVC, na którym będziesz musiał użyć pragmadyrektywy:

#pragma message ( "C Preprocessor got here!" )
ty
źródło
5
Nasuwa się pytanie, czy możesz umieścić dyrektywę opartą na fladze kompilacji, aby jakoś zamienić „wiadomość pragma” i „ostrzeżenie”? Na przykład coś takiego: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... będę musiał spróbować, ale instynkt podpowiada mi, że odpowiedź brzmi: nie.
Bryan
11
@Bryan: Tak. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner
1
#pragma message () nie jest obsługiwana przez starsze wersje gcc (takie jak gcc 4.1.2, domyślna wersja na RHEL5). Nie znalazłem jeszcze odpowiedniego odpowiednika dla tych starszych wersji - #warning nie będzie świetny, ponieważ ostrzeżenia są dla nas ogólnie traktowane jako błędy i naprawdę chcielibyśmy, aby wiadomość miała charakter informacyjny, zamiast przerywać kompilację.
Danny S
6
Wysłanie ostrzeżenia jest bardzo niewygodne, gdy projekt domyślnie kompiluje się z opcją -Wall. Wiadomość #pragma nie ma tego problemu.
Renan Gemignani
56

Następujące są obsługiwane przez MSVC i GCC .

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

Clang zaczął ostatnio dodawać obsługę, zobacz tutaj, aby uzyskać więcej informacji.

Matt Joiner
źródło
3
Dla przypomnienia, Solaris Studio 12.3 (Sun C 5.12) nie obsługuje tej pragmy.
maxschlepzig
Współpracuje z Arduino 1.8 przy użyciu Visual Studio vMicro. Dzięki!
save_jeff
12

Możesz spróbować: #pragma message("Hello World!")

Ruel
źródło
9

Większość kompilatorów C rozpozna #warningdyrektywę, więc

 #warning "Got here"

Jest też standardowa dyrektywa „#error”,

 #error "Got here"

Chociaż wszystkie kompilatory to obsługują, zatrzyma to również kompilację / przetwarzanie wstępne.

nr
źródło
6
#pragma message("foo")

działa świetnie. Również nie zatrzyma kompilacji, nawet jeśli użyjesz -Werror

Jaskółka oknówka
źródło
0

Innym rozwiązaniem jest użycie komentarzy i skryptu powłoki do ich przetwarzania. Wymaga to pewnej dyscypliny (lub skryptu powłoki, który wyłapuje literówki).

Na przykład dodaję sformatowane komentarze //TODO a następnie skrypt powłoki, który zbiera je wszystkie w raporcie.

W przypadku bardziej złożonych przypadków użycia możesz spróbować napisać własny prosty preprocesor. Na przykład możesz edytować źródła jako *.c2pliki. Prosty preprocesor czyta źródło, szuka //TODOi zapisuje printf("TODO ...")do *.cpliku wyjściowego .

Aaron Digulla
źródło
-17

Nie możesz. Preprocesory są przetwarzane przed kodem C. Nie ma dyrektyw preprocesora do wydrukowania na ekranie, ponieważ kod preprocesora nie jest wykonywany, jest używany do generowania kodu C, który zostanie skompilowany do kodu wykonywalnego.

Coś nie tak z:

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

Ponieważ to wszystko, co możesz zrobić, jeśli chodzi o preprocesory.

Alexander Rafferty
źródło
5
To nie zostanie wydrukowane w czasie kompilacji, a myślę, że właśnie tego szuka OP.
Bob Kaufman,
Zakładałem, że miał na myśli drukowanie w czasie wykonywania.
Alexander Rafferty,
1
Pytałem o czas kompilacji. Dzięki!
Andrew Wagner