2010-05-03 3 views
9

OO 유형 형식으로 작성된 레거시 C 라이브러리가 있습니다.C 라이브러리 용 C++ 래퍼 작성

LIB *lib_new(); 
void lib_free(LIB *lib); 
int lib_add_option(LIB *lib, int flags); 
void lib_change_name(LIB *lib, char *name); 

내 C++ 프로그램에서이 라이브러리를 사용하고자하는, 그래서 필요 ++ 래퍼는 C를 생각하고 있어요 : 일반적인 기능 등이있다. 는 위의 모든 같은에 매핑 할 것 같다 : 내가 전에 C++ 래퍼 라운드 C를 쓴 적이

class LIB 
{ 
    public: 
     LIB(); 
     ~LIB(); 
     int add_option(int flags); 
     void change_name(char *name); 
... 
}; 

, 그것에 대해 많은 조언을 찾을 수 없습니다. 이것은 C++/C 래퍼를 만드는 데 좋은/일반적인/합리적인 접근법입니까?

답변

8

C++ 래퍼가 필요하지 않습니다. C++ 코드에서 C 함수를 호출하기 만하면됩니다. IMHO, C 코드를 랩핑하지 않는 것이 가장 좋습니다 - C++ 코드로 바꾸려면 괜찮습니다. 그러나 완전히 다시 작성하십시오.

실제로, 당신의 C 함수를 가정하면 다음과 같이 그들을 포함 할 것이다 C++ 코드에서 다음 파일이라고 myfuncs.h에 선언되어있다 :

extern "C" { 
    #include "myfuncs.h" 
} 

그들에게 C의 연결을 제공하기 위해 컴파일 할 때 C++ 컴파일러.

+0

자신을 반복하지 마십시오? –

+0

@Neil : 싸우지 않습니까? –

+6

나는 동의하지 않는다 (그러나 downvote 없음). 간단한 C 라이브러리의 경우 래퍼가 필요없는 경우가 많습니다. 그러나 더 복잡한 C 라이브러리의 경우 경량 C 래퍼가 매우 유용 할 수 있습니다. 한 가지 예가 떠오릅니다. Tibco는 Tibrv를 감싸는 매우 가벼운 래퍼를 가지고있어서 대단히 도움이됩니다. –

2

라이브러리를 더 단순하게 사용한다면 래퍼를 작성하는 것이 좋습니다. 귀하의 경우에는 LIB *를 전달할 필요가 없으므로 아마도 스택에 LIB 개체를 만들 수 있으므로 이것이 개선이라고 말할 수 있습니다.

+0

LIB :: LIB 개체를 전달해야합니다. 스택에 LIB :: LIB 객체를 할당하면 새로운 C LIB 객체가 생성시 힙에 할당되므로 자동 의미 체계 만 제공합니다. 그러나 이것에도 불구하고 C++ 래퍼는 여전히 유용합니다. –

2

일반적으로 어떻게 접근할까요? 또한 char *를 사용하지 않지만 std :: string을 사용합니다.

1

C++ 래퍼 자체가 필요하지 않습니다. 코드에서 C 함수를 호출하는 것을 막을 수있는 방법은 없습니다.

1

아무것도는 "해방"

이름 변경이 게터 세터 될 가능성이없는 경우 나 또한 조금 더 나은 뭔가 LIB의 이름을 변경보고 싶은데 ...

그래서 GetName (숯불 *) SetName (char *)

그리고 나서 std :: string 대신 char *로 변경하십시오. SetName (const std :: string name)이 char *을 매개 변수로 사용하는 경우 변경하십시오. 이것은 함께 사용할 수있는 형식 변환 연산자

class Database: boost::noncopyable { 
    public: 
    Database(): handle(db_construct()) { 
     if (!handle) throw std::runtime_error("..."); 
    } 
    ~Database() { db_destruct(handle); } 
    operator db_t*() { return handle; } 
    private: 
    db_t* handle; 
}; 

:

즉 서서히 평소 각 부재의 기능을 배치하는 간단한 RAII 래퍼 대신 물품

5

C의 ++의 ISMS 이동 C 함수 :

Database db; 
db_access(db, ...); // Calling a C function with db's type conversion operator