2011-10-20 3 views
2

가능한 중복 :
How can I pass a C++ member function to a C API as a parameter전달 C++ C 함수에 함수 포인터는

안녕 내가 다시 같은 전화를 기대하는 C 함수와 클래스가 다음 : 무효 fun_c (무효 *를 (* ptr) (void *)).

지금 나는 사람이 어떻게하는지 말해 줄 수, C 함수에 C++ 방법을 보낼 :

class ClassA{ 
    method1(){ 
    func(ClassA::func); 
    } 
    void * func(void * arg){ 
    } 
} 

수있는 사람 것이 일을.

+0

예제 코드에서'method1()'은 리턴 타입을 가지지 않지만 생성자/소멸자는 아니다. 'method1'의'func'는'ClassA :: func'과 같을 것이고, 포인터 자체에 대한 포인터는 이상합니다. 'func'에 대한 서명은 실제로 함수 포인터를 사용하지 않으며, 합법이 아닌'void * '를 사용합니다. – Flexo

답변

0

C 코드는 인스턴스를 사용할 수 없거나 처리 할 수있는 지식이 없으므로 인스턴스 함수로는이 작업을 수행 할 수 없습니다. 대신에 정적 함수를 사용해야합니다.

0

기본적으로 보통 이런 경우 당신은 콜백 기능이 다시 당신이 그것을 줄 일부 데이터 * 포인터를 호출하는

void MyCallBack(void* arg) 
{ 
    ClassA * p = static_cast<ClassA*> (arg); 
    //Invoke any member functions of p as needed 
    p->HandleCallBack(); 
} 

이는 가정을 기반으로 선언 할 수 있습니다. 그리고 당신이 당신의 콜을 설정할 때 이것을 넘겨 준다.

+1

그리고 기술적으로 그것은 또한 extern "C"'가 필요합니다. 실제로 C++ 구현체는 C 함수처럼 무료 C++ 함수에도 동일한 호출 규칙을 사용합니다. 안타깝게도'fun_c'가 데이터 포인터를 사용하지 않고 함수 포인터 만 사용하기 때문에 C API가 잘못 설계된 것 같습니다. 그래서 질문자는 운이 없다. –

+0

죄송합니다. 내 실수 : class ClassA { method1() { func (ClassA :: func); } void * func (void * arg) { } } – maheshgupta024