Преобразование void*
к указателю функции непосредственно (не следует компилировать с использованием каких-либо приведений) в C++ 98/03. Он условно поддерживается в C++ 0x (реализация может выбрать определение поведения, и если он ее определит, то он должен делать то, что говорит стандарт. A void*
, как определено стандартом C++ 98/03 , предназначалось для обозначения объектов и не содержать указателей на функции или указателей элементов.
Зная, что то, что вы делаете, зависит от реализации, вот один из вариантов, который должен компилироваться и работать (при условии, что 32-битные указатели используют длинные длинные 64 бит) на большинстве платформ, даже если это явно не определено поведение в соответствии со стандартом:
void *gptr = dlsym(some symbol..) ;
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr)) ;
а вот еще один вариант, который должен собрать и работать, но Карр х годов те же оговорки, с ним, как указано выше:
fptr my_ptr = 0;
*reinterpret_cast<void**>(&my_ptr) = gptr;
Или, Рапида ...
// get the address which is an object pointer
void (*(*object_ptr))() = &my_ptr;
// convert it to void** which is also an object pointer
void ** ppv = reinterpret_cast<void**>(object_ptr);
// assign the address in the memory cell named by 'gptr'
// to the memory cell that is named by 'my_ptr' which is
// the same memory cell that is pointed to
// by the memory cell that is named by 'ppv'
*ppv = gptr;
Это существенно использует тот факт, что адрес указателя функции является указатель на объект [void (*(*object_ptr))()]
- поэтому мы можем использовать reinterpret_cast
, чтобы преобразовать его в любой другой указатель объекта: например, void**
. Затем мы можем выполнить обратный адрес (путем разыменования void **) до фактического указателя функции и сохранить там значение gptr.
yuk - отнюдь не определенный код - но он должен делать то, что вы ожидаете от него в большинстве реализаций.
тьфу, ваше форматирование имеют беспорядок. –
Вам действительно нужно исправить этот код, чтобы мы могли его прочитать. Что с чертой? Вы пытаетесь ввести my_fptr = static_cast (gptr)? –
Исправлена проблема форматирования. Вместо использования тегов HTML используйте доступные кнопки форматирования. – Naveen