2013-03-22 6 views
11

Ich habe den folgenden Code versucht:Warum erhalte ich in C keinen Fehler, wenn ich eine globale Variable in einem anderen Datentyp in einer anderen Datei deklariere?

file1.c:

int x; 

file2.c:

extern char x; 
main() 
{ 
    x=10; 
    .... 
    .... 
} 

und als

$ gcc file1.c file2.c zusammengestellt

und ich habe keinen Fehler bekommen, aber ich habe einen erwartet.

+1

Kompilieren Sie mit '-Wall' und sehen Sie, ob Sie Warnungen –

+0

mögliche Duplikate von [Was sind externe Variablen in C?] (Http://stackoverflow.com/questions/1433204/what-are -extern-variables-in-c) – mensi

+4

* Mit großer Macht kommt große Verantwortung * – UmNyobe

Antwort

18

In File.c versprechen Sie dem Compiler, dass x vom Typ char ist. Da jede Übersetzungseinheit separat kompiliert wird, hat der Compiler keine Möglichkeit, dies zu überprüfen, und nimmt Ihr Wort dafür. Und der Linker führt keine Typprüfung durch. Sie erhalten ein ungültiges Programm, das ohne Fehler erstellt wird.

Deshalb sollten Sie Header-Dateien verwenden. Wenn File1.c und File2.c beide eine extern Deklaration von x aus demselben Header erhielten, dann würden Sie einen Fehler beim Kompilieren von File1.c erhalten (weil die Definition nicht mit der Deklaration übereinstimmt). [Hat Tipp @SteveJessop]

+0

Das ist es. Und da 10 sowohl ein gültiges 'int' als auch ein gültiges' char' ist, funktioniert die Kompilierung gut. – Fabien

+0

Danke Steve für die Klärung, dass zu mir .. Aber ich wurde neugierig und jetzt initialisierte ich die globale Variable x als char in file1 und deklarierte es als int in file2 und ich habe einen Wert von 1000 gesetzt, die nicht umgehen kann und es zu drucken. . Nach Ihrer Erklärung erwarte ich jetzt einen Laufzeitfehler und ich habe keinen bekommen .. – Adi

+1

@BillHicks: Das Verhalten Ihres Codes ist undefiniert (http://en.wikipedia.org/wiki/Undefined_behavior). Es muss nicht abstürzen oder Ihnen einen Laufzeitfehler geben. Es besteht die Möglichkeit, auf andere Art und Weise fehlzufunktionieren (oder nicht). – NPE