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

int a=2; 
//main.cpp 

include<iostream> 

static int a=1; 
extern int a; 

int main(){ 

    std::cout << a ; 
} 

Выход 1, почему не 2? Почему нет ошибки? Я ожидаю, что здесь есть переменная из другого файла.Путаница с экстерном

+0

Пожалуйста, отформатируйте код [правильно] (http://stackoverflow.com/editing-help). – Lasoloz

+1

Вы не указали 'second.h' внутри' main.cpp'. – Holt

+0

. Я не хочу включать second.h, я хочу, чтобы extern переменной из this.thanks в любом случае. – nazi

ответ

0

extern заставляет компилятор обрабатывать строку как декларацию, а не определение. То есть,

extern int a; 

просто заявляет, что переменная a была определена где-то, и будет присутствовать во время компоновки. Это в том же файле (и, следовательно, не совсем «внешнем») на самом деле не имеет значения. Это может быть быть внешним, это просто случается, что это не так.

А почему нет никакой ошибки ... если ваш главный не имеет

#include "second.h" 

, то вы не можете ожидать, что она будет рассматриваться в любом случае. Компиляция происходит в исходных файлах ('cpp'); и он включает только заголовки, которые вы явно указываете на #include. Если вы это сделаете, вы получите ошибку переопределения переменной.

Если добавить второй источник файл, компилировать их вместе, и закомментируйте static int a = 1; в главном файле, то вы действительно получите a=2.

Если вы не прокомментируете эту строку, похоже, что в VS2015 static заметит extern, и вы получите a=1, а не ошибку. Я действительно не уверен, что это ожидаемая функция, или просто ошибка, которую никто не нашел раньше, потому что никто даже не подумал бы попробовать что-то подобное.

 Смежные вопросы

  • Нет связанных вопросов^_^