extern int i. так определение это или объявление?

запутался совсем. знаменитый бестолковый пример x/y: имеем 2 файла cpp первый файл extern int x; int y = x+1;

второй файл extern int y; int x = y+1;

понятно, что в зависимости от того какой файл выполнится первым будет другой результат. В эккеле утверждается , что для всех статических объектов (наверно имеется ввиду выделяющихся в статической области памяти) механизм компоновки и загрузки гарантирует гарантирует , что перед выполнением динамической инициализации, определяемой программистом , статические данные будут инициализированы нулями. в связи с этим непонимание . Верно ли я понимаю , что к примеру если срабатывает файл №1 первым x это грубо говоря никакое не объявление , а уже полноценное определение так как приобретает и адрес и значение ноль ???


Ответы (1 шт):

Автор решения: Harry

Для исходного файла это объявление. В нем будет записано, что есть переменная 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.

Ну, а развязка адресов происходит уже на этапе линковки (компоновки), а не компиляции. Не говоря уж о получении значений переменными, которое тут получается уже только при выполнении...

→ Ссылка