>  기사  >  백엔드 개발  >  C에서 Void 포인터를 함수 포인터로 변환하려면 어떻게 해야 합니까?

C에서 Void 포인터를 함수 포인터로 변환하려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-11-03 21:57:31442검색

How Can I Convert a Void Pointer to a Function Pointer in C  ?

C에서 함수 포인터 캐스팅

void 포인터를 함수 포인터로 유형 변환하는 것은 프로그래밍의 일반적인 시나리오입니다. 그러나 C에서는 C 98/03 표준에 정의된 대로 void를 함수 포인터로 직접 변환하는 것이 허용되지 않습니다. 이는 표준에 따르면 void가 함수 포인터나 멤버 포인터가 아닌 객체를 가리키도록 의도되었기 때문입니다.

C 98/03 표준의 제한된 캐스팅에도 불구하고 다음과 같은 방법이 있습니다. 특정 상황에서 전환을 달성합니다. 이러한 메서드는 구현에 따라 다르며 컴파일러 및 운영 체제에 따라 다르게 동작할 수 있습니다.

옵션 1: 이중 재해석 캐스트

한 가지 접근 방식은 이중 재해석을 사용하는 것입니다. Cast:

<code class="cpp">void *gptr = dlsym(some symbol...);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>

여기서 gptr은 먼저 long 정수로 캐스팅된 다음 long에서 대상 함수 포인터 유형으로 캐스팅이 수행됩니다. 이 접근 방식은 모든 플랫폼에서 작동한다고 보장되지 않으며 C 표준의 일부가 아닙니다.

옵션 2: Void 및 주소 조작**

대체 방법은 다음과 같습니다. void** 및 주소 조작:

<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void**&my_ptr = gptr;</code>

이 경우 void를 사용하여 함수 포인터의 주소를 저장합니다. gptr의 주소를 void에 할당하면 함수 포인터의 주소에 간접적으로 액세스할 수 있습니다. 이 방법은 구현에 따라 다릅니다.

이러한 기술은 특정 플랫폼 동작을 활용하며 C 표준에 의해 잘 정의되지 않는다는 점에 유의하는 것이 중요합니다. 대부분의 경우 작동할 수 있지만 잠재적인 불일치 및 이식성 문제를 인식하는 것이 중요합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.