2010-04-14 6 views
11

검색했지만 찾지 못했습니다 (용어가 잘못되었을 수 있습니다). 전에 물어 본 적이 있다면 용서하십시오.함수 포인터를 선언하지 않고 void *를 함수로 호출합니다.

void*을 함수 포인터로 선언 한 다음 함수 포인터에 주소를 할당하지 않고 C에서 함수를 호출하는 쉬운 방법이 있는지 궁금합니다.

즉. 호출 할 수있는 기능을 가정하면, 내가 오류 C2066 얻을 위의 코드와 void(void)

void *ptr; 
ptr = <some address>; 
((void*())ptr)(); /* call ptr as function here */ 

을 입력입니다 : 유형을 작동하려면 캐스트가

이 가능한 경우 VC2008

에서 불법
이다, 어떻게 구문은 다를 것 반환 유형 및 여러 매개 변수가있는 함수의 경우?

답변

22

캐스트가되어야합니다 : 그것은 함수 포인터 타입 형식 정의를 위해 더 쉽고 읽을 수있어 일반적으로

((void (*)(void)) ptr)(); 

을,이 함수 포인터 유형에 대한 typedef를 작성하여 간단하게 만들 수 있습니다 :

이 교류가 있지만
typedef void (*func_type)(void); 
((func_type) ptr)(); 

그러나 나는, 또는 (함수 포인터는 엄격하게 정당하지 않은에서 일반 포인터를 캐스팅 (포인터가 반대하는) 것을 지적해야한다 ommon 확장). C++에서

+0

내가 뭘 찾고 있었는지, 고마워. –

12

함수 유형으로 형변환 할 때 나는 혼란스러워합니다.

void *ptr = ...; 
typedef void (*void_f)(void); 
((void_f)ptr)(); 
11

: reinterpret_cast< void(*)() > (ptr)()

reinterpret_cast의 사용은 당신에게 혼란을 괄호 세트를 저장하고, < > 명확하게 호출 자체에서 떨어져 유형을 설정합니다.

관련 문제