Существует любопытная разница между сборками небольшой программы, когда она скомпилирована как C-программа или как С++-программа (для Linux x86-64).
Код, о котором идет речь:
int fun();
int main(){
return fun();
}
Компиляция в виде C-программы (с gcc -O2
) дает:
main:
xorl %eax, %eax
jmp fun
Но компиляция в виде С++-программы (с g++ -02
) дает:
main:
jmp _Z3funv
Я нахожу загадочным, что C-версия инициализирует возвращаемое значение основной функции с помощью 0
(xorl %eax, %eax
).
Какая особенность C-языка отвечает за эту необходимость?
Изменить: Верно, что для int fun(void);
инициализация eax-регистра не является.
Если прототипа fun
вообще нет, то есть:
int main(){
return fun();
}
тогда C-компилятор снова повторяет регистр eax.