Vorrang von -D MACRO und #define MACRO

8

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

%Vor%

Welche von diesen hat Vorrang?

    
maniac_inside 19.10.2010, 06:52
quelle

5 Antworten

7

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 :

%Vor%

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.

    
RBerteig 19.10.2010 07:04
quelle
5

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.

    
Matt 15.05.2012 18:07
quelle
4

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.

    
David Brown 19.10.2010 07:01
quelle
4

Sie erhalten einen Fehler bei der Neudefinition von Makros. Offensichtlich wird -D zuerst definiert (bevor die Quelldatei geparst wird und nicht danach) oder sie hätte keine Verwendung. Die #define ist dann eine Neudefinition.

    
R.. 19.10.2010 07:01
quelle
1

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.

    
Peter Miehle 19.10.2010 07:01
quelle

Tags und Links