Wenn ich eine C Datei habe foo.c und während ich -DMACRO=1
als Befehlszeilenoption für die Kompilierung angegeben habe. Wenn ich innerhalb der Header-Datei auch habe
Welche von diesen hat Vorrang?
Die Befehlszeilenoptionen gelten vor jeder Zeile, die aus einer Datei gelesen wird. Der Dateiinhalt gilt in der Reihenfolge, in der er geschrieben wurde. Im Allgemeinen erhalten Sie mindestens eine Warnung, wenn ein Makro neu definiert wird, unabhängig davon, ob die Befehlszeile betroffen ist. Die Warnung kann stummgeschaltet werden, wenn die Neudefinition keine Rolle spielt, möglicherweise weil beide Definitionen identisch sind.
Der richtige Weg, um eine Frage wie diese zu beantworten, ist, einen kleinen Testfall zu bauen und es zu versuchen. Zum Beispiel in q3965956.c setzen Sie Folgendes:
%Vor% und führe es durch den C-Präprozessor, vielleicht mit gcc -E
:
Sie können anhand der Ausgabe sehen, dass das Makro auf den von #define
in der Datei angegebenen Wert erweitert wurde. Außerdem können Sie anhand der Reihenfolge von #
Direktiven sehen, dass sowohl vordefinierte Definitionen als auch die Befehlszeile vor jedem Inhalt von Zeile 1 von q3965956.c
verarbeitet wurden.
Ich nehme an, was Sie tun, aber wenn Sie von der Befehlszeile einen nicht standardmäßigen Wert für dieses Makro angeben möchten, versuchen Sie dies für die Makrodefinition:
%Vor%Auf diese Weise wird, wenn das MACRO bereits definiert wurde (über den Befehlszeilenparameter), es weder neu definiert noch zu einem Fehler führen.
Defines werden gespeichert, damit der Compiler sie sieht, und wenn der Compiler auf ein neues Makro mit demselben Namen stößt, überschreibt es das vorherige Makro mit dem neuen (zumindest ist das in gcc der Fall). GCC wird Sie auch warnen, wenn dies passiert.
Handbuch sagt: zuerst alle-D und -U werden in der Reihenfolge ausgewertet und dann alle-includes (unter Abschnitt -D)
bester Weg: Probieren Sie es aus.
Tags und Links c gcc c-preprocessor