2010-07-19 7 views
15

Was ist die Standardspeicherklasse einer globalen Variablen?Was ist die Standardspeicherklasse für globale Variablen?

Bei der Suche im Internet habe ich festgestellt, einige Websites sagen, es ist static. Statisch bedeutet jedoch eine interne Verknüpfung, und die Variable kann außerhalb des Dateibereichs nicht verfügbar sein, d. H. Sie sollte nicht für andere Objektdateien verfügbar sein. Aber sie können weiterhin auf andere Dateien mit Deklarationen wie extern int i zugegriffen werden.

Und, wenn ich explizit static zu globalen Variable erwähnen, dann ist es nicht außerhalb des Dateibereichs verfügbar.

Dann, was ist die richtige Standardspeicherklasse für die globalen Variablen?

Antwort

15

Die Standardspeicherdauer ist statisch, die Standardverknüpfung ist jedoch extern. Du bist nicht der Einzige, der es etwas verwirrend findet. The C Book (immer eine gute Referenz) sagt:

„Sie werden wahrscheinlich die Wechselwirkungen zwischen diesen verschiedenen Elementen finden komplex und verwirrend zu sein: das ist , weil sie“

Der Abschnitt mit diesem Zitat, Declarations, Definitions and Accessibility, hat eine hilfreiche Tabelle (8.1). In der letzten Zeile wird der Fall beschrieben, an dem Sie interessiert sind. Datenobjekte ohne Speicherklassenbezeichner weisen eine externe Verknüpfung und eine statische Dauer auf.

+0

aber um eine interne Verbindung zu haben, definieren wir global als 'static int i' und wenn die Standardspeicherklasse einer globalen Variable statisch ist, dann würde ihre Definition wie' static int i' aussehen, was eine interne Verbindung bedeutet. –

+0

Wie gesagt, die Standardverknüpfung ist extern. Der Standardwert von static gilt nur für die Dauer. –

+1

Um einen anderen Schlüssel in die Arbeit zu werfen: in C++ haben konstante Objekte standardmäßig interne Verknüpfung. –

16

Es gibt keine "Standardspeicherklasse" für allgemein bekannte "globale" Variablen. Wenn eine Variable im Namensraumbereich definiert ist, hat sie immer statische Speicherdauer. Es gibt keine Möglichkeit, das zu ändern, weshalb die Idee von etwas "Standard" hier nicht anwendbar ist. (Und Lagerdauer ist, was es richtig genannt wird.)

Wenn Sie das Keyword angewendet static auf eine Variable in Namespace Bereich definiert es wirkt sich nicht auf seine Lagerdauer - es war statisch bereits und es bleibt statisch - aber es betrifft es Verknüpfung. Das Schlüsselwort static ändert die Verknüpfung einer solchen Variablen von extern (Standard) zu intern. Verbindung ist ein separates Konzept, praktisch nicht verwandt mit Speicherdauer.