Согласно пункту 9 n.670 пункта 6.6 адрес функции является адресной константой , в соответствии с 6.7.9, это означает, что он может использоваться для инициализации глобальных переменных. Я почти уверен, что это также верно C89.
Однако
На нормальных платформах значение указателя функции (или любого другого указателя, кроме NULL
) известно только во время выполнения. Это означает, что инициализация вашей структуры не может иметь место до времени выполнения. Это не всегда относится к исполняемым файлам, но почти всегда применяется к общим объектам, таким как расширения Python. Я рекомендую прочитать эссе Ульриха Дреппера на эту тему ( ссылка ).
Я не знаю, на каких платформах это сломано, но если разработчики Python упоминают об этом, это почти наверняка, потому что одна из них укушена этим. Если вам действительно любопытно, попробуйте взглянуть на старое расширение Python и посмотреть, есть ли соответствующее сообщение в журналах фиксации.
Редактировать: Похоже, что большинство модулей Python просто делают обычные вещи и статически инициализируют структуры типов, например, static type obj = { function_ptr ... };
. Например, посмотрите на модуль mmap
, который загружается динамически.