Warum bekomme ich in C keine 'Mehrfache Definitionen' von enum?

8

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?

    
Paz 27.01.2014, 19:49
quelle

2 Antworten

3

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.

    
DAhrens 27.01.2014, 20:46
quelle
4

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.

    
Jens Gustedt 27.01.2014 19:53
quelle

Tags und Links