7 Stimmen

extern und global in c

Kann mir jemand sagen, ob es eine besondere Anforderung für die Verwendung von entweder EXTERN ou GLOBAL Variablen in einem C-Programm? Ich sehe keinen Unterschied in einem Programm wie unten, wenn ich von gloabl zu extern wechsle.

#include <stdio.h>
#include <stdlib.h>
int myGlobalvar = 10;

int main(int argc, char *argv[])
{
  int myFunc(int);
  int i;
  i = 12;
  myGlobalvar = 100;
  printf("Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  i = myFunc(10);
  printf("Value of passed value : %d\n",i);
  printf("again Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  system("PAUSE");  
  return 0;
}
int myFunc(int i)
{
    i = 20 + 1000;
//extern int myGlobalvar;
myGlobalvar = 20000;
//    printf("Value of passed value : %d",i);
return i;
}

Wenn unkommentiert extern int myGlobalvar ändert sich der Wert nicht.

Gibt es irgendwelche correct Unterschied zwischen beiden?

Kann mich bitte jemand korrigieren?

33voto

Thomas Wouters Punkte 124421

Das Schlüsselwort extern bedeutet "der Speicher für diese Variable wird an anderer Stelle zugewiesen". Es sagt dem Compiler: "Ich referenziere myGlobalvar hier, und Sie haben es noch nicht gesehen, aber das ist in Ordnung; der Linker wird wissen, wovon Sie sprechen." In Ihrem speziellen Beispiel ist das nicht besonders nützlich, weil der Compiler tut wissen über myGlobalvar -- sie ist bereits in der gleichen Übersetzungseinheit definiert ( .c ou .cc Datei). Normalerweise verwenden Sie extern wenn Sie sich auf etwas beziehen wollen, das no in der aktuellen Übersetzungseinheit, z.B. eine Variable, die in einer Bibliothek definiert ist, mit der Sie verlinken werden.

(Natürlich würde diese Bibliothek normalerweise die extern Variablen für Sie in einer Header-Datei, die Sie einbinden sollten).

15voto

MAS1 Punkte 1633

De Hier :

Eine globale Variable in C/C++ ist eine Variable, auf die von jedem Modul in Ihrem Programm aus zugegriffen werden kann.

int myGlobalVariable;

Dadurch wird Speicher für die Daten zugewiesen und dem Compiler mitgeteilt, dass Sie auf diesen Speicher mit dem Namen 'myGlobalVariable' zugreifen wollen.

Aber was tun Sie, wenn Sie von einem anderen Modul im Programm auf diese Variable zugreifen wollen? Sie können nicht dieselbe Anweisung wie oben verwenden, denn dann hätten Sie zwei Variablen mit dem Namen "myGlobalVariable", und das ist nicht erlaubt. Die Lösung besteht also darin, die Variable in den anderen Modulen DECLARE zu nennen, ohne sie zu DEFINIEREN:

extern int myGlobalVariable;

Dies teilt dem Compiler mit: "Es gibt eine in einem anderen Modul definierte Variable namens myGlobalVariable vom Typ Integer. Ich möchte, dass du meine Versuche, auf sie zuzugreifen, akzeptierst, aber weise ihr keinen Speicherplatz zu, weil ein anderes Modul dies bereits getan hat".

6voto

ThePhi Punkte 1806

Kurz gesagt: GLOBAL Variablen werden in einer Datei deklariert. Auf sie kann aber in einer anderen Datei nur mit der Option EXTERN Wort vorher (in dieser anderen Datei). In derselben Datei ist es nicht nötig, das EXTERN .

zum Beispiel:

meine_datei.cpp

int global_var = 3;
int main(){
}

Sie können auf die globale Variable in derselben Datei zugreifen. Sie müssen nicht EXTERN :

meine_datei.cpp

int global_var = 3;
int main(){
    ++global_var;
    std::cout << global_var; // Displays '4'
}

Auf die globale Variable kann per Definition auch von allen anderen Dateien zugegriffen werden. ABER, in diesem Fall müssen Sie auf die globale Variable mit EXTERN .

Also, mit meine_datei.cpp zur Erklärung der global_var , in andere_datei.cpp wenn Sie dies versuchen:

andere_datei.cpp

int main(){
    ++global_var; // ERROR!!! Compiler is complaining of a 'non-declared' variable
    std::cout << global_var; 
}

Tun Sie es stattdessen:

int main(){
    extern int global_var;//Note: 'int global_var' without 'extern' would
                          // simply create a separate different variable
    ++global_var;         // and '++global_var' wouldn't work since it'll
                          // complain that the variable was not initiazed.
    std::cout << global_var; // WORKING: it shows '4'
}

4voto

codaddict Punkte 426877

Desde myGlobalvar wurde defined die Funktion myFunc . Seine declaration innerhalb der Funktion ist überflüssig.

Aber wenn die definition war nach die Funktion, müssen wir die declaration .

int myFunc(int i)
{
    i = 20 + 1000;
    extern int myGlobalvar; // Declaration must now.
    myGlobalvar = 20000;
    printf("Value of passed value : %d",i);
    return i;
}

int myGlobalvar = 10; // Def after the function.

1voto

Eli Bendersky Punkte 246100

myGlobalVar so wie Sie sie definiert haben, ist eine globale Variable, die von allen Stellen in Ihrem Programm aus sichtbar ist. Es ist nicht nötig, sie zu deklarieren extern in der gleichen .c-Datei. Das ist für andere .c-Dateien nützlich, um den Compiler wissen zu lassen, dass diese Variable verwendet werden soll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X