> 백엔드 개발 > C++ > C에서 Void 포인터를 함수 포인터로 변환할 수 있나요?

C에서 Void 포인터를 함수 포인터로 변환할 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-11-03 04:42:31
원래의
800명이 탐색했습니다.

Can C   Convert a Void Pointer to a Function Pointer?

공허 포인터를 함수 포인터로 변환: C의 조건부 가능성

문제

dlsym()을 통해 무효 포인터를 얻는 목적은 다음과 같습니다. 해당 포인터가 참조하는 함수를 호출합니다. C 스타일의 캐스팅과 달리 static_cast나 reinterpret_cast를 사용한 캐스팅을 통한 변환 시도가 실패했습니다.

답변

C 98/03에서는 void 포인터를 함수 포인터로 직접 변환하는 것이 허용되지 않습니다. 그러나 C 0x는 조건부 지원을 제공하므로 구현이 동작을 지시할 수 있습니다.

정의되지 않은 동작 접근 방식:

표준에 의해 정의되지 않았지만 다음 코드가 작동할 수 있습니다. 대부분의 플랫폼:

<code class="cpp">void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
로그인 후 복사

또는:

<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>
로그인 후 복사

복잡하지만 이식 가능한 접근 방식:

이 방법은 함수 포인터의 주소가 객체 포인터입니다.

<code class="cpp">// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast<void**>(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;</code>
로그인 후 복사

이 접근 방식은 표준에 정의되어 있지 않지만 대부분의 구현에서 합리적으로 잘 작동합니다.

위 내용은 C에서 Void 포인터를 함수 포인터로 변환할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿