extern
заставляет компилятор обрабатывать строку как декларацию, а не определение. То есть,
extern int a;
просто заявляет, что переменная a
была определена где-то, и будет присутствовать во время компоновки. Это в том же файле (и, следовательно, не совсем «внешнем») на самом деле не имеет значения. Это может быть быть внешним, это просто случается, что это не так.
А почему нет никакой ошибки ... если ваш главный не имеет
#include "second.h"
, то вы не можете ожидать, что она будет рассматриваться в любом случае. Компиляция происходит в исходных файлах ('cpp
'); и он включает только заголовки, которые вы явно указываете на #include
. Если вы это сделаете, вы получите ошибку переопределения переменной.
Если добавить второй источник файл, компилировать их вместе, и закомментируйте static int a = 1;
в главном файле, то вы действительно получите a=2
.
Если вы не прокомментируете эту строку, похоже, что в VS2015 static
заметит extern
, и вы получите a=1
, а не ошибку. Я действительно не уверен, что это ожидаемая функция, или просто ошибка, которую никто не нашел раньше, потому что никто даже не подумал бы попробовать что-то подобное.
Пожалуйста, отформатируйте код [правильно] (http://stackoverflow.com/editing-help). – Lasoloz
Вы не указали 'second.h' внутри' main.cpp'. – Holt
. Я не хочу включать second.h, я хочу, чтобы extern переменной из this.thanks в любом случае. – nazi