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.
Bitte formatieren Sie den Code [richtig] (http://stackoverflow.com/editing-help). – Lasoloz
Sie haben 'second.h' nicht in' main.cpp' eingeschlossen. – Holt
. Ich möchte second.h nicht mit einbeziehen, ich möchte eine Variable von diesem externalisieren. Danke trotzdem. – nazi