Я много читал о внешних переменных, но, похоже, никто не обращается к ним должным образом. Если я объявляю и определяю переменную в C, она получает память, назначенную в этой области файла. но на более позднем этапе в многофайловом модульном проекте эта переменная объявляется как extern, которая должна хранить ее в сегменте данных, чтобы демонстрировать глобальное поведение, предназначенное для функций extern.
Итак, я пытаюсь выяснить, как и когда выделяется память, то есть время компиляции и поведение переменной extern во время выполнения.
Вы не extern
переменные, которые являются локальными для функций.
Внешние переменные должны быть глобальными переменными. Компоновщик обеспечивает подключение всех объектных файлов к одной и той же ячейке памяти переменной, точно так же, как это делается для функций.
Спасибо всем, объяснение @Barmar дополняет ваше объяснение
Одна из единиц компиляции должна определить переменную как глобальную переменную. При компиляции этого файла для переменной в сегменте данных выделяется память, аналогично переменным области видимости файла. Разница в том, что переменная регистрируется в таблице связей, чтобы другие объектные файлы могли ее найти.
Все остальные единицы компиляции объявляют его с помощью ключевого слова extern
. Это предотвращает выделение памяти для переменной и позволяет компоновщику найти внешнюю переменную.
Когда вы связываете все объектные файлы вместе, компоновщик находит все объектные файлы, которые имеют внешнюю ссылку на переменную, и соединяет эту ссылку с памятью, выделенной в первом объектном файле.
Пожалуйста, покажите свой код, связанный с рассматриваемой переменной. Переменная, размещенная в функции, не является областью действия файла.