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 호출부를 별도로 분리하여 구성할 수 있다는 장점입니다. 즉, 기존 소스 코드 수정 없이 작업이 가능하다는 것이죠.
여기까지가 제가 나름대로 정리한 내용입니다.
반응형
'3.구현 > C or C++' 카테고리의 다른 글
Thunk와 용법1 - 다중 상속에서 가상함수 (2) | 2011.01.12 |
---|---|
가상함수 구조 (0) | 2010.12.07 |
데이터 값을 비트 문자열로 변환 (0) | 2009.12.23 |
[링크에러 LNK2019] C++에서 C 함수 사용하기 (14) | 2009.09.02 |
C로 객체지향 흉내내기2 (0) | 2009.07.27 |