Wie deklariere ich eine statische Variable, definiere sie aber nicht

7

Manchmal müssen wir eine statische Variable deklarieren und dann verwenden. Aber der Variablenname dieser Deklaration könnte falsch sein, und der Compiler kann ihn nicht erkennen, oops!

Beispiel:

%Vor%

"some_name" und "someName" sind unterschiedlich, wir verwenden eine falsche Variable am Anfang. Wenn die Vordeklaration keine Sache definiert, wird der Compiler den Fehler erkennen.

Also, wie man eine statische Variable deklariert, aber nicht definiert? Wie kann ich die Vordeklaration in eine neue Deklaration ändern, wodurch der Compiler falsche Namen erkennt?

    
Lai Jiangshan 08.12.2009, 04:35
quelle

6 Antworten

9

gcc gibt eine Warnung aus, falls Sie Folgendes beschrieben haben:

%Vor%

Lösung: Tun Sie, was Sie gerade tun, aber ignorieren Sie Compilerwarnungen nicht;)

Bearbeiten:

Mit Ihrer aktualisierten Frage: Nein, ich glaube nicht, dass es eine Möglichkeit gibt, einfach eine statische Variable zu deklarieren (ohne sie auch zu definieren).

Die übliche Lösung besteht lediglich darin, sicherzustellen, dass alle globalen Bereichsvariablen nur einmal deklariert werden, mit einem Initialisierer, falls sie es benötigen.

    
caf 08.12.2009, 04:41
quelle
8
%Vor%

Die statische Variable some_name wurde mit 0 initialisiert; Es ist die Definition, nicht nur eine Erklärung.

IMO, eine statische Variable kann nicht einfach in C mit externem Spezifizierer deklariert werden, da ihre Verknüpfung immer intern ist.

    
Prasoon Saurav 08.12.2009 04:41
quelle
3

Es ist nicht möglich, eine nicht definierende Deklaration (d. h. "Deklaration" in Ihrer Terminologie) eines Objekts mit interner Verknüpfung in C-Sprache zu erstellen.

So nah wie möglich, ist eine vorläufige Definition , die Sie in Ihrem Beispiel haben. Aber im Falle eines Tippfehlers wird die Definition implizit zu einer unabhängigen Definition und nicht zu einem Linkerfehler führen.

    
AnT 08.12.2009 05:26
quelle
2

Ein kleiner Hintergrund:

Wie bereits erwähnt, haben statische Variablen interne Verknüpfungen, was bedeutet, dass sie nur in derselben "Kompilierungseinheit" oder Quelldatei verwendet werden können. Das heißt, Sie können es nicht in einer Headerdatei deklarieren, ihm in einer Kompilierungseinheit einen Wert zuweisen und erwarten, dass dieser Wert in einer anderen angezeigt wird.

Wenn Sie eine globale Variable (statisch oder nicht) initialisieren, legt der Compiler einfach den Anfangswert in die ausführbare Datei an dem Speicherplatz, der für die Variable reserviert ist. Mit anderen Worten, es hat immer einen Anfangswert. Natürlich können Sie den Wert jederzeit mit einer Zuweisungsanweisung überschreiben.

Vorschläge:

Wenn Sie den Wert der Variablen zum Zeitpunkt der Kompilierung wirklich nicht kennen, sollten Sie ihn in Ihrer Initialisierungsfunktion dynamisch zuweisen.

%Vor%

Wenn Sie die Variable an einer Stelle deklarieren, eine Header-Datei sagen und sie in einer Quelldatei definieren wollen, sollten Sie eine 'extern'-Deklaration verwenden, die dem Compiler sagt, dass er sich nicht darum kümmern soll, wo die Variable ist. Der Linker findet den Ort der Variablen ähnlich wie er eine Funktion in einer anderen Datei findet und die Adresse ausfüllt.

Kopfzeile:

%Vor%

Quelldatei 1:

%Vor%

Quelldatei 2:

%Vor%

Wenn Sie die Variable nur an einer Stelle deklarieren und in einer anderen definieren möchten, verwenden Sie nicht das Schlüsselwort "static". Der Nachteil davon ist, dass Sie dieselbe globale Variable nicht in verschiedenen Kompilierungseinheiten (.c-Dateien) verwenden können und Sie sie nicht in einer Header-Datei verwenden können.

    
Anton 08.12.2009 04:59
quelle
0

Müssen Sie die Variable vordefinieren? Wenn nicht, dann setze den Initialisierer auf die einzige Deklaration. Wenn Ihr Initialisierer keine Konstante ist (was C ++ erfordern würde, nicht C, IIRC), dann kann ich verstehen, warum Sie ihn vor einigen Funktionen, die ihn verwenden, deklarieren müssen. Aber dann könnte alles, was Sie für den Initialisierer benötigen, vorher deklariert werden.

Setzen Sie also Ihre konstanten Defs und statischen Variablen oben in jede Datei, so dass Ihr Initialisierer für das Statische direkt nach den Konstanten kommen kann. Dann brauchen Sie keine separate Initialisierungszeile.

In jedem anderen Fall hat caf's Recht: Es kann sich lohnen, Ihren Code mit gcc kompilieren zu lassen, nur um die Warnungen zu nutzen. Ich habe das für g ++ für eine MFC-GUI in C ++ getan. (Kompilieren, nicht laufen!)

AFAIK C hat keine Möglichkeit, eine schwache Definition zu schreiben, die zu einem Fehler führt, wenn es später keine Definition mit einem Initialisierer gibt. Es gibt immer eine implizite 0, da die Variable in den BSS-Abschnitt geht.

    
Peter Cordes 08.12.2009 04:49
quelle
-1

Wenn ich dein Problem verstehe, magst du es vielleicht nicht richtig sehen.

Wären Sie nicht besser mit extern SomeType someVar_; , das zu Ihrem Programm sagt, ich weiß, dass diese Variable bekannt sein wird, aber ich will Ihnen nicht sagen, was es jetzt ist.

Sie können daher in einer separaten Datei Ihre Variable sagen sagen

static SomeType SomeVar_;

Platzieren Sie in Ihrer Datei

extern SomeType SomeVar_

Und dann setzen Sie die Initialisierung wo immer Sie wollen.

    
malavv 08.12.2009 04:57
quelle

Tags und Links