Я читал, что преобразование указателя функции в указатель данных и наоборот работает на большинстве платформ, но не гарантируется. Почему это так? Разве оба не должны быть просто адресами в основной памяти и, следовательно, быть совместимыми?
void
. Преобразование указателя функции в void *
не должно изменять представление. void *
Значение в результате такого преобразования может быть преобразована обратно в исходный тип указателя функции, используя явное приведение, без потери информации. Примечание . Стандарт ISO C этого не требует, но он необходим для соответствия POSIX.
dlsym()
- обратите внимание на конец раздела «Использование приложения», где говорится: Обратите внимание, что преобразование из void *
указателя в указатель функции, как в:, fptr = (int (*)(int))dlsym(handle, "my_function");
не определено стандартом ISO C. Этот стандарт требует, чтобы это преобразование работало правильно в соответствующих реализациях.