“extern” innerhalb einer Funktion?

Lesezeit: 5 Minuten

Benutzer-Avatar
Kiril Kirow

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 max Innerhalb 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.

Benutzer-Avatar
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

1319500cookie-check“extern” innerhalb einer Funktion?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy