2011-04-05 2 views
3

다음에C++ 함수 포인터 구문 나는 일반적으로 함수 포인터는 다음과 같이 선언 된 것을 알고

void calling_func(void (__stdcall * callback)(int)) { *callback(1); } 

:

void __stdcall my_func(int i) {} // for assigning 

void (__stdcall * my_ptr)(int) = &my_func; 

지금 내가 그들의 인수로 함수 포인터를 가지고 여러 가지 기능을 가지고 헤더 파일에서 방금 이름을 삭제했습니다.

void calling_func(void (__stdcall *)(int)); 

및 voilá가 작동했으며 ... 잉킹 (inking) : 이것이 완전한 타입 선언이라면 일반 포인터 TYPE NAME = VALUE 구문을 사용할 수 없습니까?

나는 선언했습니다 :

(void (__stdcall *)(int)) callback = &my_func; 

그리고 그것은 또한 컴파일! 왜 이것이 더 자주 사용되지 않습니까? 이 표기법에 결함이 있습니까? 나에게 그것은 함수 포인터의 사용을 매우 쉽게 해줄 것이라고 생각한다 ... typedef에서 또한 예를 들어 : 일반적으로 그것은 typedef OLDNAME NEWNAME이다. 함수 포인터를 사용하면이 새로운 이름이 실제로는 중간에있다. 전체 표현. 함수 포인터를 반환하는 함수에 대한 표기는 ...

답변

4

이것은 선언이 아니며, callback의 캐스트이며 다음으로 지정됩니다.

범위에 기존 선언이 없습니까?

+0

좋은 지점. 나는 그가 거기에서 무엇을하고 있는지를 알 수 없었다! –

4

나를 위해 컴파일되지 않습니다. AFAIK 그것은 C++가 유효하지 않습니다.

가짜로 만들 수도 있습니다.

template <typename T> 
struct identity { 
    typedef T type; 
}; 

identity<void(*)(int)>::type callback = &my_func; 

또는 궁극적 인 승리에 대한 boost::function (또는 std::function) 같은 것을 사용합니다.

+0

쿨! 좋은 코드입니다. –

+0

@Fix : 감사합니다! –

1

나는 내 함수 포인터를 보내고 싶지만 아직 문제가있다.

typedef, 올바르게 이해하면 다른 형식의 별칭으로 새 형식을 그리지는 않습니다. 따라서 및 unsigned int은 컴파일러 불만없이 교환 할 수 있습니다. 따라서 자주 사용하는 함수 포인터 유형의 경우 typedef를 사용하면 훨씬 쉽게 작업 할 수 있습니다.

함수 포인터 형식 정의의 경우, 구문은 간다 : (당신이 지금 무슨 일을하는지 크게 다르지 않다) 내부에서 원하는 유형 이름으로

typedef IObject * (*CreateFunc)(int, Core *); 

. 대부분의 함수 수정 자 (__stdcall, __declspec 등)를 지정할 수 있습니다. * name 앞에 괄호 안에 있습니다.

매우 쉽게 값을 호출, 할당 및 가져올 수 있으며 전달하기 위해 유형을 알 수없는 경우 void *으로 변환 할 수 있습니다.