extern int i. так определение это или объявление?
запутался совсем. знаменитый бестолковый пример x/y: имеем 2 файла cpp первый файл extern int x; int y = x+1;
второй файл extern int y; int x = y+1;
понятно, что в зависимости от того какой файл выполнится первым будет другой результат. В эккеле утверждается , что для всех статических объектов (наверно имеется ввиду выделяющихся в статической области памяти) механизм компоновки и загрузки гарантирует гарантирует , что перед выполнением динамической инициализации, определяемой программистом , статические данные будут инициализированы нулями. в связи с этим непонимание . Верно ли я понимаю , что к примеру если срабатывает файл №1 первым x это грубо говоря никакое не объявление , а уже полноценное определение так как приобретает и адрес и значение ноль ???
Ответы (1 шт):
Для исходного файла это объявление. В нем будет записано, что есть переменная x с некоторым адресом, каковой будет известен позже. Он и станет известен позже - при линковке...
Вот как это выглядит в VC++:
extern int y;
int x = y + 1;
Вот ассемблер: где-то вне объявляется y
EXTRN ?y@@3HA:DWORD ; y
внутри объявляется и определяется x - у нее есть свое место в памяти и конкретный адрес:
_BSS SEGMENT
?x@@3HA DD 01H DUP (?) ; x
_BSS ENDS
и добавляется код инициализации:
??__Ex@@YAXXZ PROC ; `dynamic initializer for 'x'', COMDAT
; File G:\Tmp\Test\x.cpp
; Line 2
mov eax, DWORD PTR ?y@@3HA ; y
inc eax
mov DWORD PTR ?x@@3HA, eax ; x
ret 0
??__Ex@@YAXXZ ENDP ; `dynamic initializer for 'x''
который ссылается на внешнюю переменную.
Точно так же работает и во втором файле - с внешней x.
Ну, а развязка адресов происходит уже на этапе линковки (компоновки), а не компиляции. Не говоря уж о получении значений переменными, которое тут получается уже только при выполнении...