Расположение внешней переменной памяти и поведение времени компиляции / выполнения - PullRequest
0 голосов
/ 11 июня 2019

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

Поэтому я пытаюсь выяснить, как и когда выделяется память, то есть время компиляции и поведение времени выполнения переменной extern.

1 Ответ

3 голосов
/ 11 июня 2019

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

Все остальные модули компиляции объявляют ее с помощью ключевого слова extern.Это предотвращает выделение памяти для переменной и организует компоновщик для поиска внешней переменной.

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

...