2016-05-04 20 views
2
static uint32_t a[20] = {0}; 

undWas ist der Unterschied zwischen statischen und nicht statischen globalen

uint32_t a[20] = {0}; 

ich beide im Code verwenden

a[0] = 1; 

und so weiter ....

Wenn ich die Variable static mache und sie benutze, erhalte ich einen Fehler

variable "a" was declared but never referenced 

aber wenn ich entferne static Dinge funktionieren gut. In beiden Fällen ist das Array a ein globales Array.

Der Fehler ist mit dem MACROS.

Array-Deklaration ist getan und es wird von einigen Plattformen verwendet und ich sehe keinen Fehler darin. Derselbe Code bietet einen Fehler, da diese Deklaration/das Array auf anderen Plattformen nicht verwendet wird.

Meine schlechte !!!!

static uint32_t a[20] = {0}; 
void func() 
{ 
............... 
    #ifdef ABC 

    a[0] = 1; 

    #endif 
................ 
} 

Jetzt kompilieren kein Fehler auf der Plattform ABC kompilieren auf einige nicht ABC-Plattform ein Fehler ist.

Lösung: Wrap global auch unter dem jeweiligen Makro

#ifdef ABC 
static uint32_t a[20] = {0}; 
#endif 
+0

"statisch" bedeutet "diese Variable ist nicht _directly_ zugänglich außerhalb der Unit/Datei", aber ich verstehe nicht, warum Sie solche Fehler erhalten –

+0

Wenn Sie einen Fehler erhalten, dass eine Variable deklariert wurde, aber nie verweist, sind die Chancen Sie haben es erklärt, aber nie darauf verwiesen. (Vielleicht haben Sie auf eine andere Variable mit demselben Namen verwiesen.) –

+0

@DavidSchwartz Ja, ich frage mich, was falsch ist. Ich benutze es das gleiche Array in meinem Code. – Gopi

Antwort

4

Der Hauptunterschied ist, wenn sie als static definiert, wobei der Umfang des Arrays an die Übersetzungseinheit beschränkt ist, während, ohne statische, den Umfang in nicht auf die Übersetzungseinheit beschränkt.

Zitiert C11 Kapitel §6.2.2

Wird die Erklärung einer Dateibereichskennung für ein Objekt oder eine Funktion enthält, die Speicherklasse Spezifizierer static, die Kennung besitzt interne Bindung.

Also, im Falle eines static global, kann man nicht Verwendung, die Variable außerhalb der Übersetzungseinheit.

+0

Können Sie bitte ausarbeiten? – Gopi

+2

@Gopi Können Sie erklären, was unklar war oder woran Sie arbeiten müssen? –

+0

Hier ist ein Post über [statische Variable in C++] (http://stackoverflow.com/questions/3698043/static-variables-in-c) - ist es das gleiche in C? – user3078414

0

Das Schlüsselwort static

Fall 1: Bei der Verwendung in file scope

Beispiel:

static int x=0; // declared outside main() and all functions 

bedeutet den die Variable innerhalb der Übersetzungseinheit nur dann verwendet werden, dh die Datei, die enthält es. Bei der Verwendung in block scope

Beispiel

somefunction() 
{ 
static int x=0; 
x++; // x acting as a counter here 
} 

Die Variable x für eine hervorragende Haftung (oder es wird neu initialisiert nicht) während verschiedener:

So können Sie nicht

extern int x; // from another file 

Fall 2 tun Aufrufe der Funktion. Sie können es als Funktionsvariable verwenden, z. B. als Zähler, um zu ermitteln, wie oft eine Funktion aufgerufen wird. Der Umfang ist auf den Funktionsbaustein beschränkt.


In Bezug auf die Warnung:

Variable "a" erklärt wurde, aber nie

verwiesen

Der Speicher für eine automatische Variable zugewiesen freigegeben wird, wenn es aus dem Zusammenhang geht. Bei statischen Variablen ist dies nicht der Fall. Sie bleiben bis zum Ende der Exekution stehen. Wenn Sie keine statische Variable verwenden, könnte der Compiler Sie diesbezüglich warnen (ich schätze), damit Sie eine solche Deklaration vermeiden können.

Verwandte Themen