Почему это работает? Я думаю, что глобальные данные «инициализируются» во время компиляции (компилятор сохраняет в .global раздел в obj формате файла пустые байты, поэтому, когда раздел загружается в память, он инициализируется нулем). Итак, как можно инициализировать указатель на адрес функции, если компилятор не знает, где функция будет находиться в памяти во время выполнения?C++ - глобальный указатель на функцию
#include <iostream>
void vypis();
int neco;
int * bla = &neco;
void (*vypis_ptr)() = vypis;
int main(int argc, const char * argv[])
{
}
void vypis() {
}
Вы уверены, что компилятор беспокоится об этом? В принципе ничего нет, поэтому ему нечего делать, поэтому не нужно включать какой-либо проблемный код. –
@PhilH, конечно же, он должен, vypis_ptr - внешний вид видимого объекта. –
Такое разрешение адреса не обязательно выполняется компилятором, а загрузчиком. Единственное, что нужно сделать до начала программы. Кроме того, по крайней мере теоретически эти вещи различны для C и для C++. В C++ это может быть даже конструктор, который будет запускаться после запуска программы, но до того, как он войдет в 'main'. –