2009-03-30 7 views
2

Gibt es einen Unterschied in diesen beiden? Wenn ja, was genau ist der Unterschied? Angenommen, sie befinden sich in einer C-Funktion, die mehrmals aufgerufen werden kann.mit statischem Schlüsselwort in C lokalen Bereich zu funktionieren

  1. declare und weist in derselben Anweisung

    static uint32_t value = x;// x varies and may be passed into function.

  2. declare in einer Anweisung und in der nächsten statment zuweisen.

    static uint32_t value;

    value = x; // x varies;

Ist value aktualisiert nur das erste Mal, es wird erklärt/initialisiert oder auch bei nachfolgenden Aufrufen.

Mein Verständnis von (1) ist, dass es nur das erste Mal gesetzt wird, dass Linie so ausgeführt wird, selbst wenn x das nächste Mal die Linie ändert, wird value das selbe bleiben. Ich bin mir nicht sicher über (2) aber Klärung auf beiden wird sehr hilfreich sein

EDIT: Compiler ARM (ADS1.20). EDIT: Eine Follow-up-Frage zu (2) aus den bisher gegebenen Antworten. Wird die Erklärung (nicht die Zuordnung) bei jedem Anruf oder nur beim ersten Mal wiederholt?

+0

Da Sie in Ihrer Frage ziemlich klar machen, dass Ihr Code in C ist, entfernte ich das C++ - Tag. Diese Sprachen sind nicht gleich und die Antwort auf Ihre Frage hängt stark davon ab, welche Sie verwenden. –

+0

nein ich denke, er spricht über C++. in C 1.) ist nicht möglich. oder ... nun, ich bin mir auch nicht sicher. Wenn man sich die Antworten ansieht, nehmen sie es alle, da der Fragesteller einen Fehler gemacht hat mit 1). Lass uns warten, was MeThinks sagt –

+0

Der einzige Ort, der C++ erwähnte, war das C++ - Tag (jetzt entfernt). Der Fragetitel und -körper sagten beide "C" und erwähnen C++ nicht. –

Antwort

11

Die erste sollte nicht kompilieren; Die statische Variable erfordert einen konstanten Initialisierer.

Die zweite setzt value jedes Mal, wenn die Funktion aufgerufen wird, so gab es keine Notwendigkeit, es static an erster Stelle zu machen.

Wenn die erste Schreibweise korrekt war - initialisiert value zu 1, sagen Sie - dann würde es einmal initialisiert werden, wenn das Programm startet und danach nur neue Werte nehmen, wenn der Code es geändert hat. Die zweite Schreibweise setzt immer noch value bei jedem Aufruf der Funktion und macht so die Verwendung von static sinnlos. (Nun, wenn Sie sich stark genug bemühen, können Sie Szenarien entwickeln, unter denen die zweite Version für static verwendet wird. Wenn die Funktion z. B. einen Zeiger darauf zurückgibt, den anderer Code dann ändert, dann könnte es erforderlich sein, aber das ist esoterisch im Extremfall und wäre ein ziemlich schlechter "Code-Geruch".)

+0

Das erste Beispiel kompiliert für mich. –

+0

Oder der Wert von x könnte von vorherigen den vorherigen Wert von Wert abhängen. Scheint immer noch wie ein Code-Geruch, wie du sagst. – RussellH

+0

Bitte überprüfen Sie den C++ - Standard 6.7.4. Das erste Beispiel ist absolut gültig. –

2

1 wird nur einmal ausgeführt, aber für 2 wird der Wert jedes Mal neu zugewiesen. Statische Variablen sind initialisiert nur einmal.

+0

Der erste kompiliert nicht - der Initialisierer muss eine Konstante sein. –

+0

nicht, wenn der Fragesteller tatsächlich über C++ gesprochen hat (vorausgesetzt, er hat es als C++ getaggt). Ich habe oft die Frage gesehen, wo sie nach C++ gefragt haben, aber nur "C" geschrieben, aber als C++ markiert (leider ..). Sie sahen aber auch C, aber C++. warten wir auf MeThinks –

+0

Die Frage ist explizit über C-Funktion, sowohl im Titel als auch im Haupttext; das C++ - Tag wurde verlegt, denke ich. –

0

Ihre Intuition ist richtig. Im zweiten Beispiel wird der Wert jedes Mal auf x gesetzt, wenn die Methode aufgerufen wird. Statische Variablen müssen in eine-Anweisung initialisiert und deklariert werden, wenn sie nur einmal ausgeführt werden soll.

Wenn Wert immer den Wert x haben soll, deklarieren Sie ihn nicht als statisch.

2

Dies sind sehr unterschiedliche Deklarationen.

Die erste deklariert eine statische lokale Variable und gibt ihr einen Anfangswert (dies sollte nicht wirklich kompiliert werden, da x keine Konstante ist). Dies wird nur einmal vorkommen, bevor die Funktion alle ausgeführt wird.Dies ist mit ziemlicher Sicherheit die gewünschte Initialisierung.

Die zweite Deklaration aktualisiert den Wert jedes Mal, wenn die Funktion aufgerufen wird. Wenn die Variable die Funktion immer mit dem gleichen Wert starten soll, ist dies der richtige Ansatz. Aber wenn das wirklich das ist, was du willst, warum benutzt du dann überhaupt eine Statik? Verwenden Sie einfach eine lokale Variable.

+0

x ist keine Konstante. –

+0

@ Jonathan, danke, lies gleich nach. – JaredPar

+0

In 2, hatte ich den Eindruck, die Deklaration ist nur, wenn die Funktion das erste Mal aufgerufen wird und die Zuordnung ist jedes Mal, wenn die Funktion aufgerufen wird. Ist das richtiges Verständnis? Hat es einen Vorteil, nur einmal zu deklarieren und die Aufgabe nur bei jedem Anruf auszuführen? – dubnde

0

Bei der Kompilierung wird der erste in den Abschnitt ".data" gestellt, in dem die Daten initialisiert werden, während der zweite in den Abschnitt ".bss" eingefügt wird, in dem die Daten nicht initialisiert sind.

Verwenden Sie readelf -Sx xx.o kann die Abschnittsgröße der kompilierten Objektdatei überprüfen.

Beispiel 1: static int i;

void test(){ 
    i = 2; 
} 

Beispiel 2:

static int i=1; 

void test(){ 
    i = 2; 
} 
0

Folks - In C, die erste Erklärung ist vollkommen legal. Es wird kompiliert und könnte verwendet werden, um den Wert zu initialisieren. Sie könnten die Codezeile aus der zweiten Deklaration kombinieren, um sicherzustellen, dass sie bei jeder nachfolgenden Funktionsausführung aktualisiert wird. Dies wird häufig verwendet, insbesondere in eingebetteten Programmen, in denen Speicher und Ressourcen knapper sind als Computer oder verteilte Anwendungen.

Der Grund, warum Sie eine statische verwenden, ist sicherzustellen, dass die Variable ein Datenlebenszyklus hat, der während der Programmausführung fortgesetzt wird, während der Zugriff nur auf die Funktion der statischen deklariert wird oder eine Funktion in der Datei, wenn die statische Deklaration ist oben auf der Datei, sonst gehen die Daten jedes Mal verloren, wenn die Funktion beendet wird. Dies ist eine gute Programmierpraxis, um einen versehentlichen Zugriff auf Datenobjekte zu vermeiden, die gesichert und eingeschränkt werden müssen. Dieser Kommentar gilt nur für die Programmiersprache C, verwechseln Sie dies nicht mit C++ (wo es in einigen Fällen geschieht) oder JAVA. Static in Java hat eine ganz andere Bedeutung. Von dem, was ich in diesem Thread gelesen habe, scheinen nur wenige zu verstehen, wie das Schlüsselwort static in C funktioniert, und verwirren das Schlüsselwort statisch andere Sprachen in C anzuwenden. In C ist statisch ein sehr wichtiges Schlüsselwort, das hilft, Funktionen zu verwalten und Datenzugriff, und Sie können eine statische Variable mit einer anderen Variablen initialisieren, vorausgesetzt, sie befindet sich innerhalb des Bereichs, und Sie können diesen Wert während der gesamten Programmausführung aktualisieren, was Sie wahrscheinlich sowieso tun müssten.

Verwandte Themen