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.
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.
+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.
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.
#include<stdio.h>//const int a=10; /* can not modify */intmain(void){
// your code goes here//static const int const a=10; /* can not modify */constint a=10;
int *const ptr=&a;
*ptr=18;
printf("The val a is %d",a);
return0;
}
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:
#include<stdlib.h>voidmy_function(){
constint foo = rand(); // Perfectly OK!staticconstint bar = rand(); // Compile time error.
}
Wenn eine lokale Variable "wirklich konstant" sein soll, müssen Sie sie nicht nur "const", sondern auch "static const" definieren.
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?
Antworten:
Der Unterschied ist die Verknüpfung.
// At file scope static const int a=5; // internal linkage const int i=5; // external linkage
Wenn das
i
Objekt nicht außerhalb der Übersetzungseinheit verwendet wird, in der es definiert ist, sollten Sie es mit dem Bezeichner deklarierenstatic
.Dies ermöglicht dem Compiler (möglicherweise) weitere Optimierungen und informiert den Leser, dass das Objekt nicht außerhalb seiner Übersetzungseinheit verwendet wird.
quelle
const int i = 5;
externe Verknüpfung hat? In C ++ nicht ...const
nichts mit C ++ zu tunconst
.static
Bestimmt die Sichtbarkeit außerhalb einer Funktion oder die Lebensdauer einer Variablen innerhalb. Es hat also nichts mit sich selbst zu tunconst
.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.static
außerhalb einer Funktion bedeutet, dass der Bereich des markierten Symbolsstatic
auf diese .c-Datei beschränkt ist und außerhalb dieser nicht angezeigt werden kann.Technisch gesehen (wenn Sie dies nachschlagen möchten)
static
ist es ein Speicherspezifizierer undconst
ein Typqualifizierer.quelle
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.
#include <stdio.h> //const int a=10; /* can not modify */ int main(void) { // your code goes here //static const int const a=10; /* can not modify */ const int a=10; int *const ptr=&a; *ptr=18; printf("The val a is %d",a); return 0; }
quelle
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:
#include <stdlib.h> void my_function() { const int foo = rand(); // Perfectly OK! static const int bar = rand(); // Compile time error. }
Wenn eine lokale Variable "wirklich konstant" sein soll, müssen Sie sie nicht nur "const", sondern auch "static const" definieren.
quelle
foo
die Variable bei jedemmy_function()
Aufruf neu initialisiert wird, wird ein anderer Zufallswert zugewiesen. Im Fall vonbar
der nur einmal initialisiert Variable, das erste Malmy_function()
aufgerufen wird in der gleichen Wert , der sich für die Laufzeit des Programms zugewiesen werden. Daher statische Speicherdauer.bar
darand()
keine Kompilierungszeitkonstante vorliegt .