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 중국어 웹사이트의 기타 관련 기사를 참조하세요!