Gibt es eine tragbare Möglichkeit, eine Nachricht vom C-Präprozessor zu drucken?

99

Ich würde gerne so etwas machen können

#print "C Preprocessor got here!"

für Debugging-Zwecke. Was ist der beste / tragbarste Weg, dies zu tun?

Andrew Wagner
quelle

Antworten:

114

Die warningDirektive ist wahrscheinlich die nächstgelegene, aber sie ist nicht vollständig plattformunabhängig:

#warning "C Preprocessor got here!"

AFAIK Dies funktioniert auf den meisten Compilern mit Ausnahme von MSVC, für die Sie eine pragmaDirektive verwenden müssen:

#pragma message ( "C Preprocessor got here!" )
Du
quelle
5
Was die Frage aufwirft, können Sie eine Direktive basierend auf einem Kompilierungsflag setzen, um "Pragma-Nachricht" und "Warnung" irgendwie auszutauschen? Zum Beispiel so etwas wie: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... Ich muss das versuchen, aber der Instinkt sagt mir, dass die Antwort nein ist.
Bryan
11
@ Bryan: Ja. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner
1
#pragma message () wird von älteren Versionen von gcc nicht unterstützt (z. B. gcc 4.1.2, die Standardversion von RHEL5). Ich habe noch kein geeignetes Äquivalent für diese älteren Versionen gefunden - #warning wird nicht großartig sein, da Warnungen für uns im Allgemeinen als Fehler behandelt werden und wir möchten, dass die Nachricht eher informativ ist, als die Kompilierung zu stoppen.
Danny S
6
Das Ausgeben einer Warnung ist sehr unpraktisch, wenn Ihr Projekt standardmäßig mit -Wall kompiliert wird. #pragma message hat dieses Problem nicht.
Renan Gemignani
56

Folgendes wird von MSVC und GCC unterstützt .

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

Clang hat vor kurzem damit begonnen, Unterstützung hinzuzufügen . Weitere Informationen finden Sie hier .

Matt Joiner
quelle
3
Solaris Studio 12.3 (Sun C 5.12) unterstützt dieses Pragma nicht.
Maxschlepzig
Funktioniert mit Arduino 1.8 mit Visual Studio vMicro. Vielen Dank!
save_jeff
12

Vielleicht möchten Sie versuchen: #pragma message("Hello World!")

Ruel
quelle
9

Die meisten C-Compiler erkennen also eine #warningDirektive

 #warning "Got here"

Es gibt auch die Standard-Direktive '#error',

 #error "Got here"

Obwohl alle Compiler dies unterstützen, wird auch die Kompilierung / Vorverarbeitung gestoppt.

nr
quelle
6
#pragma message("foo")

funktioniert super. Auch würde die Kompilierung nicht aufhören, selbst wenn Sie -Werror verwenden

Martin
quelle
0

Eine andere Lösung besteht darin, Kommentare und ein Shell-Skript zu verwenden, um sie zu verarbeiten. Dies erfordert etwas Disziplin (oder ein Shell-Skript, das Tippfehler abfängt).

Zum Beispiel füge ich formatierte Kommentare //TODOund dann ein Shell-Skript hinzu, das alle in einem Bericht sammelt.

Für komplexere Anwendungsfälle können Sie versuchen, Ihren eigenen einfachen Präprozessor zu schreiben. Sie können beispielsweise Ihre Quellen als *.c2Dateien bearbeiten . Der einfache Präprozessor würde die Quelle lesen, suchen //TODOund printf("TODO ...")in die Ausgabedatei schreiben *.c.

Aaron Digulla
quelle
-17

Das kannst du nicht. Präprozessoren werden vor dem C-Code verarbeitet. Es gibt keine Präprozessoranweisungen, die auf dem Bildschirm gedruckt werden müssen, da Präprozessorcode nicht ausgeführt wird. Er wird zum Generieren des C-Codes verwendet, der in ausführbaren Code kompiliert wird.

Irgendwas falsch mit:

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

Denn das ist alles, was Sie für Präprozessoren tun können.

Alexander Rafferty
quelle
5
Dies wird zur Kompilierungszeit nicht gedruckt, was meiner Meinung nach OP sucht.
Bob Kaufman
Ich nahm an, er meinte das Drucken zur Laufzeit.
Alexander Rafferty
1
Ich habe nach der Kompilierungszeit gefragt. Vielen Dank!
Andrew Wagner