«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Может ли C++ преобразовать пустой указатель в указатель на функцию?

Может ли C++ преобразовать пустой указатель в указатель на функцию?

Опубликовано 12 ноября 2024 г.
Просматривать:813

Can C   Convert a Void Pointer to a Function Pointer?

Преобразование пустых указателей в указатели на функции: условная возможность в C

Проблема

Получение пустого указателя через dlsym(), цель состоит в том, чтобы вызвать функцию, на которую ссылается этот указатель. Попытка преобразования посредством приведения с использованием static_cast или reinterpret_cast не удалась, в отличие от приведения в стиле C.

Ответ

Прямое преобразование указателя void в указатель на функцию недопустимо в C 98/03. Однако C 0x предлагает условную поддержку, позволяющую реализации диктовать поведение. большинство платформ:

void *gptr = dlsym(какой-то символ..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

Альтернативно:

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

Сложный, но переносимый подход:

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

// Получить адрес как указатель объекта void (**object_ptr)() = &my_ptr; // Преобразование в void** (также указатель объекта) void **ppv = reinterpret_cast(object_ptr); // Сохраняем адрес из 'gptr' в ячейке памяти, на которую указывает 'ppv' *ppv = gptr;

Этот подход не определен в стандарте, но должен работать достаточно хорошо в большинстве реализаций.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3