Was ist der Unterschied zwischen statischer Konstante und Konstante?

82

Was ist der Unterschied zwischen static constund const? Zum Beispiel:

Gibt es einen Unterschied zwischen ihnen? Wann würden Sie eins über das andere verwenden?

Lior
quelle
2
Siehe auch
halex
5
Zur Wiedereröffnung gewählt. Das "Duplikat" stellt eine ganz andere Frage, die spezifisch für die Speichernutzung ist. Diese Frage stellt eine allgemeinere Frage zum Unterschied.
rmaddy

Antworten:

57

Der Unterschied ist die Verknüpfung.

Wenn das iObjekt nicht außerhalb der Übersetzungseinheit verwendet wird, in der es definiert ist, sollten Sie es mit dem Bezeichner deklarieren static.

Dies ermöglicht dem Compiler (möglicherweise) weitere Optimierungen und informiert den Leser, dass das Objekt nicht außerhalb seiner Übersetzungseinheit verwendet wird.

ouah
quelle
8
+1 Es wäre großartig, wenn Sie auch hinzufügen könnten, was es bedeutet, wenn sich diese Deklarationen innerhalb einer Funktion befinden.
Prätorianer
Sind Sie sicher, dass const int i = 5;externe Verknüpfung hat? In C ++ nicht ...
Kerrek SB
4
@ KerrekSB im Dateibereich, ja. (C99, 6.2.2p5) "Wenn die Deklaration eines Bezeichners für ein Objekt einen Dateibereich und keinen Speicherklassenspezifizierer hat, ist seine Verknüpfung extern."
Ouah
13
@ KerrekSB: C und C ++ sind nicht dieselbe Sprache. Insbesondere hat C constnichts mit C ++ zu tun const.
R .. GitHub STOP HELPING ICE
Optimieren Compiler wirklich statisch? Es scheint nicht sicher zu sein, anzunehmen, dass ein statisches Objekt nicht außerhalb seiner Übersetzungseinheit verwendet wird, da es weiterhin von einer nicht statischen Funktion ausgegeben oder von einem nicht statischen globalen Zeiger angezeigt werden kann.
nw.
100

staticBestimmt die Sichtbarkeit außerhalb einer Funktion oder die Lebensdauer einer Variablen innerhalb. Es hat also nichts mit sich selbst zu tun const.

const bedeutet, dass Sie den Wert nach der Initialisierung nicht ändern.

static Innerhalb einer Funktion bedeutet dies, dass die Variable vor und nach dem Ende der Funktion vorhanden ist.

staticaußerhalb einer Funktion bedeutet, dass der Bereich des markierten Symbols staticauf diese .c-Datei beschränkt ist und außerhalb dieser nicht angezeigt werden kann.

Technisch gesehen (wenn Sie dies nachschlagen möchten) staticist es ein Speicherspezifizierer und constein Typqualifizierer.

Joe
quelle
0

const int i = 5;
i-Wert, den Sie mithilfe eines Zeigers ändern können, wenn i lokal definiert und deklariert ist, wenn er statisch ist const int a = 5; oder const int i = 5; Global können Sie keine Änderungen vornehmen, da diese im RO-Speicher des Datensegments gespeichert sind.

Tobin
quelle
-1

Es hängt davon ab, ob sich diese Definitionen innerhalb einer Funktion befinden oder nicht. Die Antwort für den Fall außerhalb einer Funktion wird oben von ouah gegeben. Innerhalb einer Funktion ist der Effekt unterschiedlich, wie im folgenden Beispiel dargestellt:

Wenn eine lokale Variable "wirklich konstant" sein soll, müssen Sie sie nicht nur "const", sondern auch "static const" definieren.

Nibot
quelle
Es kompiliert perfekt für mich ... Aber ich weiß, dass es dumm ist, in diesem Fall eine statische const-Variable zu haben.
DrumM
1
@ DrumM es ist nicht dumm. Wenn foodie Variable bei jedem my_function()Aufruf neu initialisiert wird, wird ein anderer Zufallswert zugewiesen. Im Fall von barder nur einmal initialisiert Variable, das erste Mal my_function()aufgerufen wird in der gleichen Wert , der sich für die Laufzeit des Programms zugewiesen werden. Daher statische Speicherdauer.
jb
1
Tatsächlich hängt es bei weiteren Überlegungen davon ab, ob wir C oder C ++ verwenden. Die Frage ist mit C gekennzeichnet. In diesem Fall erhalten wir einen Kompilierungsfehler für die Zuweisung von, barda rand()keine Kompilierungszeitkonstante vorliegt .
jb
1
@nibot Können Sie klarstellen, was Sie unter "Der Effekt ist anders" und "wirklich konstant" in Bezug auf die Speicherspezifikation und die Typqualifizierung verstehen?
jb