C함수에서 C++함수 호출하기
글쓴이: coathanger / 작성시간: 수, 2008/04/30 - 10:42오전
안녕하세요.. 검색 해 보니 중복되는 질문이지만 이해력이 부족하여 게시물 등록을 하게되었습니다.
//C++ 함수
void CUFPT::ControlSlTimer()
{
//statement..
}
//C 함수
void Caller(void)
{
ControlSlTimer();
}위와 같이 C++함수와, C함수를 같은 소스파일안에 사용하고 있습니다. 그런데 C++ 클래스 내부함수인 CUFPT::ControlSlTimer()를
C함수 내에서 위와 같이 void Caller(void)인 C함수에서 호출하려면 어떻게 해야 하나요..
검색 해 보았더니 extern "C"로 C++을 감싸라고 하는데.. 제가 잘 몰라서 해봤더니 되지 않더군요...
클래스 정의 부분도 extern "C"로 감싸야 하는지.. 내부함수 정의 부분도 감싸야 하는지 방법을 모르겠습니다.
감싸는 방법과 호출할 경우 위 처럼 해도 되는건지 지도 부탁 드립니다.;; 불가피하게 C++함수를 호출해야 하는데.. 골치 아프군요..
Forums:


제가 알기로는
제가 알기로는 다음과 같이 알고 있습니다.
* C++ 함수에서 C함수를 호출할 수 있다.(extern "C" 사용)
* C함수에서 C++ 함수는 호출할 수 없다.
C++ 멤버 함수를 C에서 호출하려면 좀 귀찮은 방법을 거쳐야합니다.
일단 C에서 this pointer를 모르기 때문에, 이런 래퍼가 필요합니다. (그리고 C++ linkage가 아니라 C linkage로 만들게 extern "C"로 선언된 함수여야합니다)
extern "C" void call_cpp_function( void* CUFPT_object )
{
((CUFPT*)CUFPT_object)->ControlTimer();
}
같은 형식으로 선언하고, 함수를 호출할 객체를 넘겨주면서 호출하면됩니다.
(다만 class 선언을 인식 못할테니 void* 로 캐스팅해서 전달하게 되죠)
답변 감사합니다.
그러나 위 함수를 만들고 호출하는 곳은 C함수인데 객체가 C함수에서 안만들어 집니다.
어떤 식으로 객체를 만들어서 넘기는건지.. 죄송합니다..
당연히 C++
당연히 C++ 코드쪽에서 만들어야죠.
대략 이런 식으로 하면 됩니다.
// C++ code class CUFPT { public: CUFPT(const char* s); // just for example void ControlSlTimer(); }; extern "C" CUFPT* createObject(const char* s) { return new CUFPT(s); } extern "C" void destroyObject(CUFPT* p) { delete p; } extern "C" void callMemberFunction(CUFPT* p) { p->ControlSlTimer(); } extern "C" void createAndCallMemberFunction(const char* s) { CUFPT object(s); object.ControlSlTimer(); } // C code struct CUFPT; struct CUFPT* createObject(const char* s); void destroyObject(struct CUFPT* p); void callMemberFunction(struct CUFPT* p); void createAndCallMemberFunction(const char* s); void caller() { const char* s = "some info"; struct CUFPT* object = createObject(s); callMemberFunction(object); destroyObject(object); // ... or let C++ code take care of construction and destruction createAndCallMemberFunction(s); }감사합니다.
상세한 답변 정말 감사합니다. (_ _)
댓글 달기