2016-04-27 16 views
2

Betrachten Sie den Fall einer Klassenmemberfunktion, die in einer Kopfzeile mit einer Speichervariablen static definiert ist. Wenn Sie die Kopfzeile in mehrere Übersetzungseinheiten einschließen, erhalten Sie mehrere Kopien der static-Variable. Wählen Sie jedoch the compiler will fix this for you, und wählen Sie einfach eine der emittierten Variablen (beachten Sie, dass dies anders ist als Inlining). Dies wird ermöglicht durch eine GNU-spezifische Erweiterung der möglichen Typen eines Symbols, genauer gnu_unique_object (sie erscheinen als "u" in nm, die sie in den Manpages "eindeutige globale Symbole" aufruft).Manuelles Erstellen von gnu_unique_object-Symbolen

Die Frage ist, wie zwingen Sie den Compiler, diese Art von Symbolen für beliebige Variablen zu erzeugen? Ich bin es leid, Dinge in eine Klasse zu verpacken, um dieses Verhalten zu bekommen.

+0

Der Link, den Sie bieten beschreibt ein Verhalten, das für ladbare Module (auch bekannt als Shared Libraries), die speziell umgesetzt wurde. Ist es der Kontext, in dem Sie Ihre statischen Variablen verwenden möchten? Sie sprechen von mehreren Kompilierungseinheiten, aber nicht von mehreren gemeinsam genutzten Bibliotheken. Wenn nicht, dann können Sie die Dinge sicherlich einfacher machen. Bitte sagen Sie uns einfach, welches Verhalten Sie am Ende für diese Variablen erwarten. – dim

+0

@dim es wurde möglicherweise für shared libraries implementiert, aber gcc verwendet es, um das beschriebene Verhalten zu implementieren. –

+0

Gut, aber ich verstehe immer noch nicht: wenn Sie sagen "eine Klasse Mitglied Funktion in einem Header definiert, mit einer statischen Speichervariable". Meinst du "eine Variable definiert mit statischem Speicher, deklariert im Körper einer Mitgliedsfunktion einer Klasse"? Oder eine Klasse, die sowohl eine Memberfunktion als auch eine Membervariable mit statischem Speicher enthält? – dim

Antwort

0

Wenn Sie die globale Variable in einer Header-Datei deklarieren, erhalten Sie eine andere Instantiierung dieser Variablen in jeder Kompilierungseinheit. Das Keyword extern ist das, wonach Sie suchen. Dieses Schlüsselwort macht etwas, das wie eine Instanziierung aussieht, in eine Vorwärtsdeklaration. Es kann als Versprechen betrachtet werden, dass eine Variable dieses Namens in einer anderen Kompilierungseinheit instanziiert wird und beim Verknüpfen gefunden werden kann.

MyTrueGlobals.h

extern int global_variable_1; 

MyTrueGlobals.cpp

int global_variable_1 = 0; 
+0

Das ist genau das, was ich versuche zu vermeiden, und * es ist möglich * zu vermeiden, indem ich mache, was ich in der Frage beschrieben habe. –

+0

Was vermeidest du? Eine cpp Datei haben? Niemand hier scheint deine Frage zu verstehen, mich eingeschlossen. Der obige Kommentar von @dim ist wahrscheinlich die beste Wahl, das Verhalten des Schlüsselworts 'inline' scheint das zu sein, was Sie suchen, aber es kann nur auf Funktionen angewendet werden (so wie ich es verstehe). – Jfevold