Okay, zu erklären, statische Globale variable .h-Datei?
Schlüsselwort "static" behält den Gültigkeitsbereich einer globalen Variablen begrenzt auf diese übersetzung Einheit.
Wenn ich static int x
in einem .h-Datei, und schließen Sie,.h-Datei, jede weitere Datei, nicht alle gehören zu der gleichen übersetzungseinheit?
Dann, nicht x überall sichtbar?
Also, was ist die Rolle der statischen jetzt?
Außerdem gibt es jede Nutzung static const int x
,wo x ist eine Globale variable?
Sind nicht alle, const Globale Variablen statische standardmäßig?
Und ist eine const-variable Geltungsbereich beschränkt sich auf die TU, auch wenn es sich in einer Schleife in die Datei?
Ich fand die häufigste Anwendung der Statik im Header ist die Einführung von bugs, oder machen das Debuggen schwieriger.
InformationsquelleAutor batman | 2012-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie schreiben,
in einem .h Datei dann jede übersetzungseinheit, dass #include-s dieses .h Ihre eigene private variable
x
.Wenn Sie möchten haben 1 Globale variable für alle sichtbar, schreiben Sie
in der .h Datei und
in einem der .cpp - Dateien.
Wenn Sie möchten, um eine statische const-int-sichtbar auf nur eine übersetzungseinheit - erwähnen es nicht in der .h Dateien an.
InformationsquelleAutor Alexander Chertov
Wenn Sie erklären etwas als statische (nicht in einer Klasse, für die Klasse Schlüsselwort static hat eine andere semantische), dass statische Variablen nicht gesehen werden kann, die außerhalb seines TU. So setzen Sie in der header-Datei wird dazu führen, dass jede TU-einschließlich header an eine andere private Kopie, die static-variable.
NICHT. Auch für eine statische const-Wert wird der Bereich bestimmt, indem es in der Erklärung. Also der Umfang wird begrenzt durch deine Klammern.
InformationsquelleAutor Heisenbug
werden Sie am Ende wird, private Kopien, die variable pro übersetzung, die in schwellen Sie an, wenn Sie ihn dort. es würde auch keinen Sinn machen, zu haben, um zufällige kopiert alle über dem Platz. Nein, es ist nicht ok.
können Sie erklären, ein
const int
imnamespace
block; das ist ok.InformationsquelleAutor justin
Beobachtbaren Unterschied für die Variablen, die
const
qualifiziert ist, dass in derstatic
version erhalten Sie ein Exemplar pro übersetzungseinheit und so-Adresse ein Vergleich von zwei Kopien fehlschlagen.Wenn Sie nie verwenden und die Adresse Ihres
const
variable jeder moderne compiler in der Lage sein sollten, benutzen Sie einfach den Wert und die Optimierung der Variablen sich aus. In einem solchen Fall einestatic
const
-qualifizierte Variablen ist völlig in Ordnung.InformationsquelleAutor Jens Gustedt
Grundsätzlich jede source-Datei zusammen mit allen inkludierten header-Dateien ist eine einzelne übersetzungseinheit. Wenn Sie also eine statische variable in einer header-Datei, dann wird es einzigartig in jeder Quellcode-Datei (translation unit) die header-Datei enthalten ist.
InformationsquelleAutor Some programmer dude
"statische Globale" macht keinen Sinn, Sie sind in einer Weise einander die Gegensätze.
Den Begriff "global" wird oft missbraucht, um zu beschreiben, eine deklarierte variable außerhalb einer Funktion an - Datei Umfang. Sondern eine Globale variable mit externe Bindung, zugegriffen werden kann, indem eine Datei in das Projekt - also global.
Das Gegenteil von externe Verknüpfung ist interne Verlinkung, was bedeutet, dass eine variable kann nur zugegriffen werden, indem die übersetzungseinheit wo es erklärt wird. Übersetzung Einheit Bedeutung einer
.c
- Datei und alle Header enthalten, indem es (rekursiv).static
ist eine Garantie, dass eine variable wird intern verknüpft. Also andere übersetzung wird nicht in der Lage sein, darauf zuzugreifen oder zu erklärenextern
Variablen, die auf Sie verweisen.Was passiert, wenn Sie erklären, eine
static
variable in einer header-Datei ist, dass mehr als eine übersetzungseinheit erhalten eine separate variable mit diesem Namen. Der code kompiliert wird gut, obwohl clever linkers wird bemerken dies und geben einen linker-Fehler. Diese Art von linker-Fehler sind oft nicht aussagekräftig und schwer aufzuspüren.Dies führt uns zu der folgenden best practices:
Um zu verhindern, dass solche Fehler, immer umgeben, alle header-Dateien mit "header-guards":
Erklärt alle Variablen auf file-scope deklariert werden sollte
static
für die Zwecke von privaten Verkapselung zu reduzieren namespace Durcheinander. Ebensoextern
sollte vermieden werden, denn es führt zu schlechtem design und spaghetti-Programmierung.InformationsquelleAutor Lundin