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?

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!" )

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.


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!")


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.



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 .


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.