Я использую dlsym для заполнения указателя на функцию, которая является переменной-членом вызова.
как ниже
class ABC {
private:
void (*m_fun) (int);
}
сейчас, если я назначу
m_fun = (void*) dlsym (libHandle, "fun")
Это дает ошибку
Через интернет я нашел
*(void**) (&m_fun) = dlsym(libHandle, "fun") is working.
Может кто-нибудь сказать мне, как это преобразование / кастинг происходит здесь?
Актерский состав говорит:
void*
) не указатель на функциюdlsym
хотя этот указатель, тем самым устанавливая указатель функции на этот адресЭто работает вокруг (обычно желательного) ограничения, что вы не можете назначить указатель функции на указатель объекта. Так как это C ++, вы можете написать его так:
reinterpret_cast<void*&>(m_fun) = dlsym(libHandle, "fun");
что может быть немного яснее: притворяться m_fun
это void*
и напиши ему.
Обратите внимание, что это менее переносимо, чем преобразование результата dlsym
правильному типу и присвоив его:
m_fun = reinterpret_cast<void(*)(int)>(dlsym(libHandle, "fun"));
которая либо будет работать правильно, либо выдаст ошибку компилятора на любой платформе. Ваш более хитрый бросок может привести к неопределенному поведению во время выполнения на платформах с неоднородной архитектурой памяти.
Void * это просто указатель памяти. Чтобы использовать указатель функции для указания на функцию, сначала необходимо указать указатель на фактическую функцию, а остальная часть указателя (**) должна указывать на переменные и тело функции.