Ключевое слово extern означает «объявить без определения». Другими словами, это способ явно объявить переменную или принудительно объявить без определения.
Так что в file2
вы только что объявили переменную без определения (память не выделена). В file1
вы объявили и определили переменную типа integer
. Здесь вы выделили память на BSS segment, потому что у вас есть неинициализированный глобальный (для C).
В C++ глобалы хранятся в области данных для каждого процесса обработки данных.
разница между декларацией и определением:
Чтобы понять, как внешние переменные относятся к экстерном ключевого слова, необходимо знать разницу между определением и объявлением переменной.
Когда переменная определена, компилятор выделяет память для этой переменной и, возможно, также инициализирует ее содержимое до некоторого значения. Когда объявляется переменная, компилятор требует, чтобы переменная была определена в другом месте.
Объявление сообщает компилятору, что переменная этого имени и типа существует, но компилятору не требуется выделять для нее память, поскольку она выделена в другом месте.
Hi Pierre, Спасибо, что освободили сомнение. Но как и в файле 1, var 'a' является глобальным и хранит память в сегменте данных, поэтому он будет в сегменте данных или, как вы упомянули в стеке? Я не совсем понимаю это. Вы можете объяснить, пожалуйста. – anand
В вашем случае это в сегменте [BSS] (http://en.wikipedia.org/wiki/Data_segment), потому что это инициализированная глобальная переменная. –
В стандартном C++ нет такой вещи, как сегмент BSS. –