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?

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

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 .


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


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.


6
#pragma message("foo")

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


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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.