2013-03-29 6 views
4

많은 경우 C 프레임 워크는 함수 포인터를 사용하여 기능을 확장하고 리스너 (예 : win32-api 및 GLUT)에 알립니다. 객체 지향 C++을 프로그래밍 할 때 클래스와 객체를 사용하여이를 처리하는 것을 선호합니다. 그래서 내 질문은 :정적 메서드를 함수 포인터로 사용

C 라이브러리에서 함수 포인터를 기대하는 정적 메서드에 대한 포인터를 사용하는 것이 안전합니까?

+0

전 C++ 11에서는 새로운 스레드를 만들 때 스레드 프로 시저로 정적 함수를 사용합니다. 호출 규칙 (stdcall, fastcall 등)에 문제가있을 수 있습니다. 나는 그들의 아이폰에없는 다른 누군가가 깊이있는 대답을 제공 할 것이라고 확신한다! ("reference"에 대해서도, 라이브러리가 함수 포인터를 필요로한다면 함수 포인터를 사용해야한다.) –

답변

11

공식적으로, 아니요, 실제로는 할 수 없지만 실제로는 그렇습니다. C 코드에서 호출 할 수 있으려면 C 컴파일러에서 기대하는 호출 규칙을 사용하도록 C++ 함수에 extern "C"으로 표시해야합니다. 정적 멤버 함수를 extern "C"으로 표시 할 방법이 없으므로 C 코드에서 성공적으로 호출 될 수있는 방법은 없습니다. 정적 멤버 함수에 대해 C 코드와 동일한 호출 규칙을 사용하지 않는 컴파일러에 대해서는 알지 못하므로이 방법이 유용 할 것입니다. 일부 컴파일러는 기술적으로 함수의 유형이 잘못되어이 상황에 대한 경고를 생성합니다. 실제로 C++ 표준을 보면 콜백 (예 : qsort)을 사용하는 C 함수에는 extern "C" 함수를 사용하는 함수와 extern "C++" 함수를 사용하는 함수의 두 가지 버전이 있습니다.

관련 문제