Nun, beim Lesen eines “ein bisschen alten” Buches (“Die C-Programmiersprache”, zweite Auflage, von Dennis Ritchie) bin ich auf Folgendes gestoßen:
Eine externe Variable muss genau einmal außerhalb jeder Funktion definiert werden; Dadurch wird Speicherplatz dafür reserviert. Die Variable muss auch in jeder Funktion deklariert werden, die darauf zugreifen möchte
und ich dann so – was?!
“Die Variable muss auch in jeder Funktion deklariert werden, die darauf zugreifen will”. Dann war ich noch einmal schockiert:
int max;
/* ... */
int main()
{
extern int max;
/* ... */
}
Und einer mehr – was?!
Soweit ich weiß (offensichtlich ist es nicht viel und bei weitem nicht genug), extern macht nur Sinn, wenn Sie irgendwo eine globale Variable definieren und über eine andere Datei darauf zugreifen möchten (um sie nicht erneut zu definieren).
So:
Was soll das extern int maxInnerhalb das main oder irgendeine andere funktion?
Tut die Norm Ja wirklich sagt, dass dies ein muss (dass ich für dieses Beispiel dies deklarieren muss max in jeder Funktion, die es verwenden wird?)
Gilt das auch für C++ (deshalb habe ich das C++-Tag platziert)? Das ist das erste Mal, dass ich so etwas sehe.
Hinweis: Dies ist nicht dasselbe wie Was bringt es, eine statische Variable als extern innerhalb einer Funktion zu deklarieren?
Amazon.com sagt, K&R 2nd ed. wurde 1988 veröffentlicht. Ich vermute, dass sich der Standard seitdem ein wenig verändert hat. 🙂
– dandan78
30. August 2012 um 14:54 Uhr
Ja, ich kenne das Erscheinungsjahr, dachte ich, aber ich wollte fragen, nur um sicherzugehen. Deshalb habe ich um eine Bestätigung der ISO-Norm gebeten.
– Kiril Kirow
30. August 2012 um 14:55 Uhr
@KirilKirov brauchst du Zitate aus dem C- oder C++-Standard?
– Bis in alle Ewigkeit
30. August 2012 um 15:05 Uhr
Ich denke, das wurde damals alles mit ANSI C /C89 geklärt.
– Clinton-Pierce
30. August 2012 um 15:14 Uhr
@Kiril Kirov Sie müssen die nächsten Absätze (und das gesamte Kapitel) lesen, was Ihre Verwirrung beseitigen sollte. zB “Wenn die Definition der externen Variablen in der Quelldatei auftritt, bevor sie in einer bestimmten Funktion verwendet wird, besteht keine Notwendigkeit für eine Extern-Deklaration in der Funktion.” Das Kapitel soll Ihnen ein wenig über Verknüpfung und Geltungsbereich beibringen, es tut dies mit einfachen Beispielen, die nicht unbedingt Best Practices sind.
– Nr
30. August 2012 um 15:50 Uhr
Dein Beitrag hat mich überrascht. Daran hatte ich keine Erinnerung und ich habe K&R vor langer Zeit gelesen. Ich habe nur die Erstausgabe hier und sie ist auch da. Das ist jedoch nicht alles, was es sagt. Aus der Erstausgabe:
Die Variable muss auch in jeder Funktion deklariert werden, die darauf zugreifen möchte; dies kann entweder durch eine explizite externe Deklaration oder implizit durch den Kontext erfolgen.
Beachten Sie das “implizit durch den Kontext”. Später im Text:
… wenn die externe Definition einer Variablen in der Quelldatei vor ihrer Verwendung in einer bestimmten Funktion erfolgt, ist keine Extern-Deklaration in der Funktion erforderlich. Die extern-Deklarationen in main, … sind somit überflüssig. Tatsächlich ist es üblich, die Definitionen aller externen Variablen an den Anfang der Quelldatei zu stellen und dann alle extern-Deklarationen wegzulassen.
Das bedeutet also, dass das Sichtbarmachen der externen Variablen innerhalb der Funktion nur für diese Funktion oder außerhalb jeder Funktion für alle nachfolgenden Funktionen in der Quelldatei erfolgen kann. Ich glaube, dass dies die einzige Stelle im Buch ist, wo es innerhalb der Funktion gemacht wird, später verwendet es den bekannten Einmal-für-die-Datei-Ansatz.
Scott Zhu
extern int max Innerhalb main oder Funktion sagt zum Compiler “Ich bin keine lokale Variable innerhalb der Haupt- oder Funktion, ich bin die an anderer Stelle definierte globale Variable”.
Wenn das globale in derselben Datei deklariert ist, nicht sinnvoll. In einer anderen Datei, ja, aber nicht in jeder Funktion, deklarieren Sie einfach einmal in der Head-Datei der Quelle, die diese globale Variable verwendet. Dies ist das gleiche in c++.
Das extern ist Verknüpfung. Es bedeutet dieser Name, max, ist mit anderen Vorkommen des Namens verknüpft, möglicherweise in anderen Dateien. (Das heißt, wenn die Objektmodule miteinander verknüpft werden, um eine ausführbare Datei zu erstellen, werden alle verknüpften Verweise auf diesen Namen so erstellt, dass sie auf dasselbe Objekt verweisen.)
Das Umfang dieser Deklaration ist der Rest des Funktionskörpers, in dem sie sich befindet. Das bedeutet, dass andere Funktionen in dieser Datei den durch diese Deklaration deklarierten Namen nicht sehen (es sei denn, sie deklarieren ihn selbst).
Umfang und Verknüpfung sind verschiedene Dinge.
Auch in K&R 2ed ist die Verwendung von extern in diesem Beispiel war nicht notwendig. „Unter Umständen kann die extern Deklaration kann entfallen. Wenn die Definition einer externen Variablen in der Quelldatei vor ihrer Verwendung in einer bestimmten Funktion erfolgt, besteht keine Notwendigkeit für eine extern Deklaration in der Funktion.” Die erste Instanz von int max würde als Deklaration gelten.
– Clinton-Pierce
30. August 2012 um 15:10 Uhr
Die Verwendung von extern int max innerhalb der Funktion ist möglicherweise nicht erforderlich, aber wenn int max innerhalb der Funktion vorhanden ist, die extern ist notwendig. Andernfalls, int max deklariert selbst innerhalb der Funktion ein neues automatisches Objekt ohne Verknüpfung. Es wird anders sein als das Äußere max.
– Eric Postpischil
30. August 2012 um 15:33 Uhr
Ein weiterer möglicher Grund für extern Innerhalb einer Funktion ist darauf zu achten, dass keine lokale Variable vorhanden ist Beschattung die globale Variable
Ohne extern:
int max = 33;
int main()
{
int max;
printf("%d", max); // prints indeterminate value (garbage)
}
Mit extern
int main()
{
extern int max;
int max;
printf("%d", max);
}
Ausgabe:
Fehler: Neudeklaration von „max“ ohne Verknüpfung
13195000cookie-check“extern” innerhalb einer Funktion?yes
Amazon.com sagt, K&R 2nd ed. wurde 1988 veröffentlicht. Ich vermute, dass sich der Standard seitdem ein wenig verändert hat. 🙂
– dandan78
30. August 2012 um 14:54 Uhr
Ja, ich kenne das Erscheinungsjahr, dachte ich, aber ich wollte fragen, nur um sicherzugehen. Deshalb habe ich um eine Bestätigung der ISO-Norm gebeten.
– Kiril Kirow
30. August 2012 um 14:55 Uhr
@KirilKirov brauchst du Zitate aus dem C- oder C++-Standard?
– Bis in alle Ewigkeit
30. August 2012 um 15:05 Uhr
Ich denke, das wurde damals alles mit ANSI C /C89 geklärt.
– Clinton-Pierce
30. August 2012 um 15:14 Uhr
@Kiril Kirov Sie müssen die nächsten Absätze (und das gesamte Kapitel) lesen, was Ihre Verwirrung beseitigen sollte. zB “Wenn die Definition der externen Variablen in der Quelldatei auftritt, bevor sie in einer bestimmten Funktion verwendet wird, besteht keine Notwendigkeit für eine Extern-Deklaration in der Funktion.” Das Kapitel soll Ihnen ein wenig über Verknüpfung und Geltungsbereich beibringen, es tut dies mit einfachen Beispielen, die nicht unbedingt Best Practices sind.
– Nr
30. August 2012 um 15:50 Uhr