2011-02-12 3 views
10

원격 서버에서 일부 작업을 수행하기 위해 클라이언트에서 사용할 수있는 라이브러리를 C++로 작성해야합니다. 구체적으로 내가 한 일은 아직 없습니다. C++ 라이브러리에는 C 인터페이스가 필요합니다. 내가 더 잘 설명하자 : 클라이언트 에서이 lib을 사용하여 내가 뭔가를 호출 할 필요가 : int operation (void * addr); int < 0 오차 이렇게. 그러나 도서관 그것은 C++에있는 종류이다. 내 대답은 .. 내가 라이브러리에서 클래스의 인스턴스를 보유하고있는 전역 변수가 필요합니까? C++ 클래스의 C 인터페이스를 개발하는 것이 더 나은 옵션입니까?c 인터페이스가있는 C++ 라이브러리

답변을위한 조언.

+4

핵심 답변은 이미 추세입니다. 'extern "C"{}'인터페이스 선언을 잊지 마라. –

+2

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html – Flexo

+1

실제 예를 보려면 0MQ 라이브러리 http://www.zeromq.org를 확인하십시오. C 인터페이스 (그리고 C++ 인터페이스가 그 주위에 감싸 인)와 함께 C++로 작성되었습니다. –

답변

16

PIMPL idiom은 C 랩퍼에서 사용할 수 있습니다. 내부적으로 (new을 사용하여) 생성자를 호출하고 클래스 인스턴스에 대한 포인터를 반환하는 메서드 YourClass_Create을 제공합니다. 클라이언트 코드의 경우이 인터페이스는 작동하지 않아야하는 인스턴스 (예 : FILE *stdio)를 지정하기 위해 C 인터페이스의 모든 함수에 전달되는 불투명 한 핸들입니다 (void *의 경우 typedef 일 수 있음).

이러한 모든 함수는 핸들에서 해당 메소드를 호출하고 (클래스에 대한 포인터로 다시 변환) 예외를 오류 코드로 변환해야합니다.


@으로 jdv 얀 드 VAAN 그렇지 않으면 링커 오류가 발생할 수 있습니다, 당신의 C 래퍼 코드 주위에 필요 #ifdef 에드 extern "C" {}을 잊지 말고, 자신의 의견에서 지적했다.