2013-08-02 1 views
8

Я читал об переменной extern, но не нашел ответа, связанного с ее распределением памяти. Мой вопрос: кто будет выделять память для переменной Extern и в каком сегменте памяти., где будет храниться память для переменной extern и по какому файлу

int a; // file 1 

extern int a; // file 2 

здесь файл 1 будет выделять память для файла или файла 2. В сегменте данных или в стеке?

Спасибо.

ответ

7

Ключевое слово extern означает «объявить без определения». Другими словами, это способ явно объявить переменную или принудительно объявить без определения.

Так что в file2 вы только что объявили переменную без определения (память не выделена). В file1 вы объявили и определили переменную типа integer. Здесь вы выделили память на BSS segment, потому что у вас есть неинициализированный глобальный (для C).

В C++ глобалы хранятся в области данных для каждого процесса обработки данных.


разница между декларацией и определением:

Чтобы понять, как внешние переменные относятся к экстерном ключевого слова, необходимо знать разницу между определением и объявлением переменной.

Когда переменная определена, компилятор выделяет память для этой переменной и, возможно, также инициализирует ее содержимое до некоторого значения. Когда объявляется переменная, компилятор требует, чтобы переменная была определена в другом месте.

Объявление сообщает компилятору, что переменная этого имени и типа существует, но компилятору не требуется выделять для нее память, поскольку она выделена в другом месте.

+0

Hi Pierre, Спасибо, что освободили сомнение. Но как и в файле 1, var 'a' является глобальным и хранит память в сегменте данных, поэтому он будет в сегменте данных или, как вы упомянули в стеке? Я не совсем понимаю это. Вы можете объяснить, пожалуйста. – anand

+0

В вашем случае это в сегменте [BSS] (http://en.wikipedia.org/wiki/Data_segment), потому что это инициализированная глобальная переменная. –

+0

В стандартном C++ нет такой вещи, как сегмент BSS. –

5

В файле 2 переменная целого типа называется a был объявлен (не помню никакого определения т.е. не выделения памяти для a до сих пор). И мы можем сделать это заявление столько раз, сколько необходимо. Где находится в файл 1 переменная целочисленного типа, называемая a, была объявлена ​​и определена. (помните, что определение - это супер-набор декларации). Здесь также выделяется память для a.

+0

Спасибо @hitesh, не могли бы вы рассказать мне, в каком сегменте памяти памяти будет выделено? будет ли он в сегменте данных, поскольку он будет глобальным для файла 1? И если мы не будем включать файл 1 в файл 2, например #include , то он даст какую-либо ошибку? – anand

+0

Это вызовет ошибку при компиляции. Поскольку var объявлен, но не определен нигде. Если вы хотите работать так хорошо, не включая 'file1.h', чем использовать внешнюю переменную типа' extern int a = 0; ' –