2017-09-21 16 views
7

Haskell (GHC)로 작성된 코드에 콜백 함수를 제공하려고합니다. GCC C 컴파일러와 같은 함수 유형을 사용하여 기능을 내보내고 가져오고 런타임에 코드와 상호 운용합니다.멤버 정적 콜백 함수에 대한 extern "C"

나는 사실 그 방법 클래스에 this 포인터를 받아 바로 전화 콜백 기능을 제공해야합니다 :

struct C 
{ 
    int f(int i) { ; } 
    static int f_callback(void * self, int i) 
    { 
     static_cast< C * >(self)->f(i); 
    } 
}; 

논리적으로 f_callback 클래스 C의 일부를, 그래서 해당로 배치 네임 스페이스 범위.

하지만 extern "C" 언어 사양을 사용해야합니까 (걱정하지 마세요. 전화 회의는 여기에서 중요하며 이름 변경은 아닙니다)? extern "C"을 일반 네임 스페이스에서 선언하고 정의 할 수 있지만 extern "C" 함수에 대한 몇 가지 특수 규칙이 다른 네임 스페이스에 같은 이름으로 정의되어 있지만 there is은 클래스 범위의 네임 스페이스와 단순 네임 스페이스 하나 사이에 구분이 없습니다.

static extern "C" 함수를 클래스 범위로 정의 할 수 있습니까?

+0

아니요, IIRC는 불가능합니다. 그러나 C 및 C++에서 다른 ABI 또는 스택 프레이밍을 사용한다고 걱정할 필요는 없습니다. – user0042

+0

@ user0042 '정적 __cdecl'보다 안전한 것이 있습니까? – Orient

+0

이것은 휴대용이 아닌 주석이지만 네가 사용할 수 있습니다. – user0042

답변

5

외부 콜백은 의도적으로 특정 클래스에 연결되어 있지 않습니다.

정적 클래스 멤버를 만드는 것은 코드 내부에 따라 훌륭하지만 실제를 잘못 표현합니다.

따라서 외부 독립 "C"기능을 사용하는 것이 좋습니다. 이것은 오해를 피하고 가정을 강조합니다 (예를 들어, 자기가 C라고 가정되지만 실제로는 다른 것일 수 있음). f()가 공개이면이 모든 것이 매우 깨끗합니다. 비공개 인 경우 콜백을 친구로 만들어야하고이 밀접한 연결이 다시 강조 표시되어야합니다.

래퍼 대안은 중복 중개인을 추가하여 같은 결과를 얻습니다.