2016-07-18 9 views
-5
//second.h 

int a=2; 
//main.cpp 

include<iostream> 

static int a=1; 
extern int a; 

int main(){ 

    std::cout << a ; 
} 

Ausgang 1 ist, warum nicht 2? Warum gibt es keinen Fehler? Ich erwarte, dass ich eine 'Variable' aus einer anderen Datei habeVerwirrung mit extern

+0

Bitte formatieren Sie den Code [richtig] (http://stackoverflow.com/editing-help). – Lasoloz

+1

Sie haben 'second.h' nicht in' main.cpp' eingeschlossen. – Holt

+0

. Ich möchte second.h nicht mit einbeziehen, ich möchte eine Variable von diesem externalisieren. Danke trotzdem. – nazi

Antwort

0

extern bewirkt, dass der Compiler die Zeile als Deklaration und nicht als Definition behandelt. Das heißt,

extern int a; 

erklärt nur, dass eine Variable a irgendwo definiert wurde, und wird zu Verbindungszeitpunkt vorhanden sein. Dass es in der gleichen Datei (und somit nicht wirklich "extern") ist, macht keinen Unterschied. Es könnte extern sein, es passiert einfach, dass es nicht ist.

Was, warum kein Fehler vorhanden ist ... es sei denn, Ihr Haupt eine

#include "second.h" 

hat dann kann man nicht erwarten, dass es in keiner Weise in Betracht gezogen werden. Die Kompilierung erfolgt in Quelldateien ('cpp'); und es bezieht nur die Überschriften mit ein, die Sie ihm #include ausdrücklich sagen. Wenn Sie dies tun, erhalten Sie einen Variablen-Neudefinitionsfehler.

Wenn Sie eine zweite Quelle Datei hinzufügen, kompilieren sie zusammen, und kommentieren Sie die static int a = 1; in der Hauptdatei, dann bekommt man in der Tat a=2.

Wenn Sie diese Zeile nicht kommentieren, scheint es, dass in VS2015 die static wird die extern Schatten, und Sie erhalten a=1 eher als einen Fehler. Ich bin mir wirklich nicht sicher, ob dies ein erwartetes Feature ist, oder nur ein Bug, den niemand zuvor gefunden hat, weil niemand daran denken würde, so etwas zu versuchen.