본문 바로가기

3.구현/C or C++

C에서 C++ 호출하기

C에서 C++호출하는 괜찮은 방법을 찾아서 알려드립니다.

테스트해본 결과 VC++, GCC에서도 적용 가능합니다.

작성: http://ospace.tistory.com/,2010.11.30 (ospace114@empal.com)

파일 구성

예제 소스 파일은 3개로 구성되었습니다.

  • Counter.h
    • C++헤더파일이자 멤버함수가 정의됨
    • 별도 cpp파일은 없습니다. 물론 작성도 가능합니다.
  • counter_c.h
    • C에서 사용할 헤더파일
    • 이 파일은 Counter.h에 포함되어도 됩니다.
  • counter_c.cpp
    • counter_c.h에 있는 내용을 구현한 부분.
    • 주의할 것은 cpp로 C++로 컴파일된다.
    • 이는 Counter.h의 cpp파일이 있다면 같이 포함해도 되며, 분리해도 됩니다.

위의 구현은 C++ 구현부와 C 호출부를 분리를 했습니다.

그래서 기존 라이브러리가 아닌 별도로 구성하여 관리할 수 있게 했습니다.

소스코드

소스코드를 하나씩 살펴보겠습니다.

// Counter.h
// 평범한 C++ 클래스입니다.
class Counter
{
public:
     Counter() : count(0) {}

     void inc() {
         ++count;
     }

     int getVal() {
         return count;
     }

private:
      int count;
};
// counter_c.h
// c++용 cpp입니다. 주의할 것은 extern “C”를 반드시 넣어줘야 합니다.
// 그렇지 않으면 C 링크에서 인식할 수 없습니다.
#include "counter_c.h"
#include "Counter.h"

extern "C" {

Counter* counter_new()
{
     return new Counter();
}

void counter_delete(Counter*  counter)
{
     delete  counter;
}

void counter_inc(Counter* counter)
{
     counter->inc();
}

int counter_get_val(Counter* counter)
{
     return counter->getVal();
}

}
// counter_c.h
// C 호출부정의파일입니다.
// 더미로선언한구조체도보입니다.

#ifdef __cplusplus
extern "C" {
#endif

struct Counter;

struct Counter* counter_new();

void counter_delete(struct Counter*  counter);

void counter_inc(struct Counter* counter);

int counter_get_val(struct Counter* counter);

#ifdef __cplusplus
}
#endif
// main.c
#include  "counter_c.h"

int main()
{
    struct Counter *c = counter_new();

    counter_inc(c);

    printf("Counter: %d\n", counter_get_val(c));

    counter_delete(c);

    return 0;
}

컴파일은

# g++ -c counter_c.cpp
# gcc main.c counter_c.o –lstdc++

결론

주의할 부분은 동적 할당에 의해서 사용해야 됩니다. 그냥 “struct Counter c;”로 하면 당연히 안되겠죠.
동적 할당을 했으니 마지막에 해제해주는 것도 잊으면 안됩니다.
그리고 주의할 것은 마지막에 실행파일 생성할 경우 c++용 라이브러리를 반드시 추가해줘야 합니다. 당연히 아시겠지만.. ^^;
위 구현은 클래스의 각 멤버함수를 별도 함수로 정의해서 사용하는 귀찮은 점은 있지만, C++ 구현부와 C 호출부를 별도로 분리하여 구성할 수 있다는 장점입니다. 즉, 기존 소스 코드 수정 없이 작업이 가능하다는 것이죠.

여기까지가 제가 나름대로 정리한 내용입니다.

반응형