Der grundlegendste Unterschied liegt im Umfang.
Im ersten Fall deklarieren Sie eine globale Variable. Es ist eine Variable, auf die nach ihrer Definition in jedem Bereich zugegriffen werden kann.
void setup()
{
Serial.begin(9600);
}
void inc();
int count = 0;
void loop()
{
Serial.println(count);
count++;
inc();
delay(500);
}
void inc() //Can edit the value of count
{
count=count+1;
};
Im zweiten Fall deklarieren Sie eine statische Variable mit lokalem Gültigkeitsbereich. Die Variable bleibt für den gesamten Programmlauf ähnlich wie globale Variablen bestehen, ist jedoch nur in dem Codeblock verfügbar, in dem sie deklariert ist. Dies ist das gleiche Beispiel mit nur einer Änderung. count
wird jetzt als statische Variable im Inneren deklariert loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Dies wird nicht kompiliert, da die Funktion inc()
keinen Zugriff hat count
.
Globale Variablen, wie nützlich sie auch erscheinen mögen, bergen einige Fallstricke. Diese können sogar Schäden verursachen, wenn Programme geschrieben werden, die mit der physischen Umgebung interagieren können. Dies ist ein sehr einfaches Beispiel für etwas, das sehr wahrscheinlich passieren wird, sobald Programme größer werden. Eine Funktion kann versehentlich den Status einer globalen Variablen ändern.
void setup()
{
Serial.begin(9600);
}
void another_function();
int state=0;
void loop()
{
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Inadvertently changes state
state=1;
}
Solche Fälle sind sehr schwer zu debuggen. Diese Art von Problem kann jedoch leicht erkannt werden, indem einfach eine statische Variable verwendet wird.
void setup()
{
Serial.begin(9600);
}
void another_function();
void loop()
{
static int state=0;
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Results in a compile time error. Saves time.
state=1;
}
Beide Variablen sind statisch - sie bleiben für die gesamte Ausführungssitzung bestehen. Das Globale ist für jede Funktion sichtbar, wenn es das Globale deklariert - nicht definiert - oder wenn die Funktion der Definition in derselben Kompilierungseinheit folgt (Datei + enthält).
Wenn Sie die Definition von
count
in eine Funktion verschieben, wird der Sichtbarkeitsbereich auf den nächsten umschließenden Satz von{}
es beschränkt und die Lebensdauer des Funktionsaufrufs erhöht (er wird beim Ein- und Beenden der Funktion erstellt und zerstört). Wenn Siestatic
es ebenfalls deklarieren, wird die Lebensdauer der Ausführungssitzung vom Anfang bis zum Ende der Ausführungssitzung verlängert und bleibt über Funktionsaufrufe hinweg bestehen.Übrigens: Seien Sie vorsichtig bei der Verwendung der initialisierten Statik innerhalb einer Funktion, da ich gesehen habe, dass einige Versionen des Gnu-Compilers dies falsch verstehen. Bei jedem Funktionseintrag sollte eine automatische Variable mit einem Initialisierer erstellt und initialisiert werden. Eine Statik mit einem Initialisierer sollte während des Ausführungs-Setups nur einmal initialisiert werden, bevor main () die Kontrolle erhält (genau wie ein globaler). Ich habe lokale Statiken bei jedem Funktionseintrag neu initialisieren lassen, als wären sie Automatiken, was falsch ist. Testen Sie Ihren eigenen Compiler, um sicherzugehen.
quelle
extern
?In der Dokumentation von Atmel heißt es: "Wenn eine globale Variable deklariert wird, wird dieser Variablen zur Zeit der Programmverknüpfung eine eindeutige Adresse im SRAM zugewiesen."
Die vollständige Dokumentation finden Sie hier (Tipp 2 für globale Variablen): http://www.atmel.com/images/doc8453.pdf
quelle