2

dlsym을 사용하여 호출의 멤버 변수 인 함수 포인터를 채 웁니다. 같은 지금은 할당하면함수 포인터 : * (void **) (& fun) = dlsym (lib, "fun") 어떻게 작동합니까?

class ABC { 
private: 
    void (*m_fun) (int); 
} 

아래

m_fun = (void*) dlsym (libHandle, "fun") 

그것은 내가

을 발견 인터넷을 통해 오류

을 제공

*(void**) (&m_fun) = dlsym(libHandle, "fun") is working. 

사람이 변환/주조 여기 일이 어떻게 말해 줄 수 ?

+0

m_fun = (void *) (int) dlsym ..... – SaurabhS

답변

4

캐스트는 말한다 :

  • 에 대한 포인터를 얻을 기능
  • 에 대한 포인터를 가지고 일반 개체 포인터 (void*)가 아닌 함수 포인터에 그 포인터 포인트를 척
  • 해당 포인터를 통해 dlsym에 의해 반환 된 주소를 작성함으로써 해당 주소로 함수 포인터를 설정하십시오.

이 기능은 오브젝트 포인터에 함수 포인터를 할당 할 수 없다는 (일반적으로 바람직한) 제한 사항을 해결합니다. 좀 더 명확 수 있습니다

reinterpret_cast<void*&>(m_fun) = dlsym(libHandle, "fun"); 

:이 C의 ++이기 때문에, 당신이로 쓸 수 m_funvoid* 척, 그리고 쓰기. 이 올바른 유형 dlsym 결과를 변환하고이를 할당하는 것보다 적은 휴대용 것을

참고

m_fun = reinterpret_cast<void(*)(int)>(dlsym(libHandle, "fun")); 

모든 플랫폼 올바르게 작동하거나 컴파일러 에러를 제공 하나. dodgier 캐스트가 비 균일 메모리 구조를 가진 플랫폼에서 정의되지 않은 런타임 동작을 일으킬 수 있습니다.

+1

함수 포인터와'void *'가 상호 변환 가능하지 않다면 그 플랫폼은'dlsym '어쨌든 구현. – aschepler

+0

@aschepler : 실제로. 그러나 변환은 중요하지 않을 수 있습니다.이 경우 dlsym의 결과가 아닌 할당 타겟을 캐스팅하는 것이 잘못된 일을 할 수 있습니다. –

+0

dlsym은 [POSIX에 의해 지정됩니다] (http://pubs.opengroup.org/ onlinepubs/9699919799/functions/dlsym.html), POSIX에서는'void *'를 함수 포인터로 변환해야합니다. –

0

Void *는 단지 메모리 포인터입니다. 함수 포인터를 사용하여 함수를 가리 키려면 먼저 실제 함수를 가리키는 포인터와 나머지 포인터 (**)가 변수와 함수 본문을 가리켜 야합니다.