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.
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
@dim es wurde möglicherweise für shared libraries implementiert, aber gcc verwendet es, um das beschriebene Verhalten zu implementieren. –
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