Nehmen wir an, ich habe drei Dateien:
%Vor% Das Kompilieren jedes einzelnen funktioniert, aber gcc -Wall f1.o f2.o -o prog
erzeugt:
multiple definition of 'RED'
Wenn ich jetzt const durch:
ersetze %Vor% Ich kann prog
kompilieren und RED
als const verwenden und bekomme keinen multiple definition
Fehler.
Warum unterscheidet sich das Verhalten mit enum
s von dem, das sichtbar ist, wenn Sie globale Variablen oder Strukturen mit demselben Namen in verschiedenen Dateien haben?
Eine Aufzählung wird keinen Wert im Speicher erzeugen, was bedeutet, dass beim Verknüpfen keine Adresse zur Symboltabelle hinzugefügt wird.
Eine const-Variable hat im kompilierten Objekt eine Adresse mit einem Symbolnamen. Wenn Sie versuchen, die beiden Objektdateien miteinander zu verknüpfen, haben sie jeweils den gleichen Symbolnamen "RED", der auf verschiedene Adressen verweist, was Ihren Konflikt verursacht.
Aufzählungskonstanten sind keine Objekte, sie haben nur einen Wert, aber keine Zuweisung innerhalb der ausführbaren Datei. In Ihrem zweiten Beispiel ist RED
nur eine Definition eines Wertes in jeder der Dateien. Auf der anderen Seite color
ist nicht das, was Sie denken. Es ist eine "vorläufige Definition" eines Objekts namens color
. Wenn Sie es nicht verwenden, wird es nicht zugewiesen und alles scheint gut. Aber es scheint nur so.
In Ihrem ersten Beispiel haben Sie ein const
-qualifiziertes Objekt namens RED
in jeder der Dateien. Da es initialisiert ist, ist dies eine Definition und das Symbol wird in jeder der .o
-Dateien erzeugt. Also die Beschwerde vom Linker.
Tags und Links c enums multiple-files