Mehrfachdefinition für statisches Element?

7

Konnte die folgenden zwei Dateien nicht verknüpfen, wenn ich das "statische" Schlüsselwort lösche, dann ist es in Ordnung. Getestet mit g ++. Überprüfen Sie mit readelf für die Objektdatei, das statische Element scheint als globales Objekt Symbol exportiert wird ... Ich denke, es sollte ein lokales Objekt sein ...?

static1.cpp

%Vor%

static2.cpp

%Vor%

Mit Fehlerinfo:

  

/tmp/ccIdHsDm.o :( .bss + 0x0): mehrere   Definition von 'StaticClass :: a'

    
Sam Liao 25.08.2009, 06:59
quelle

4 Antworten

16

Es scheint, als ob Sie in jeder Quelldatei mit demselben Namen lokale Klassen verwenden möchten. In C ++ können Sie lokale Klassen in einem anonymen Namespace kapseln:

%Vor%     
Ropez 25.08.2009, 07:13
quelle
9

Im Folgenden finden Sie eine Definition des statischen Datenelements. Es muss nur in einer Datei vorkommen, die kompiliert und dann verknüpft ist.

%Vor%

Wenn Sie mehrere solcher Definitionen haben, ist es so, als hätten Sie mehrere Funktionen namens first . Sie werden kollidieren und der Linker wird sich beschweren.

Ich glaube, Sie verwechseln statische Member mit statischer Gültigkeit, die auf Namespace-Scope-Variablen angewendet wird. Auf der Namespace-Ebene gibt static die interne Verknüpfung der Variablen oder Referenz an. Aber auf Klassenebene (wenn es auf ein Mitglied angewendet wird) wird es ein statisches Element - ein Element, das an die Klasse und nicht an jedes Objekt gebunden ist. Das hat dann nichts mehr mit der C-Bedeutung von "statisch" zu tun.

    
Johannes Schaub - litb 25.08.2009 07:03
quelle
2

Die Aussage

%Vor%

reserviert tatsächlich Speicherplatz für die Variable, deshalb sollte sie nur einmal geschrieben werden.

Was Ihre Bemerkung betrifft, verwirren Sie wahrscheinlich zwei verschiedene Verwendungen des Schlüsselworts static . In C bedeutet statisch "interne Verknüpfung verwenden", dh der Name einer Variablen oder Funktion wird nicht außerhalb der Übersetzungseinheit angezeigt, in der sie definiert wurde.

In Klassen wird static verwendet, um Klassenmitglieder zu definieren, dh Variablen oder Methoden, die sich nicht auf eine bestimmte Instanz der Klasse beziehen. In diesem Fall muss der Speicher für eine statische Variable irgendwo zugewiesen werden (da er nicht Teil einer Instanz ist), aber natürlich nur an einer Stelle.

    
UncleZeiv 25.08.2009 07:03
quelle
0

StaticClass benötigt einen Platz, um a zu speichern, eine statische Variable, die von allen Klasseninstanzen gemeinsam benutzt wird - es gibt zwei Zeilen, eine in jeder Datei. Das Entfernen eines wird den Linker-Fehler beheben.

    
fbrereto 25.08.2009 07:03
quelle

Tags und Links