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'
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.
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.
Tags und Links c++