2015-01-26 5 views
-1

C++ 멤버 함수로 링크해야하는 모든 기능을 가진 .obj가 있습니다. 문제는 C 언어이기 때문에 클래스를 사용하는 클래스는 정상적인 이름보다 더 끔찍한 것을 기대합니다. 그래서 이것은 두 가지 방법으로 만 수행 할 수 있습니다 : C 함수의 이름을 변경하거나 어쨌든 맹 글링 된 이름을 가진 기호 테이블에 추가 기호를 추가하십시오. 그러나 여전히 원래 이름을 사용할 수 있습니다. 근본적으로 그 이름을 망가 뜨린다. 어떤 아이디어가 이것을 어떻게하는지 또는 이것을 완전히 다른 방법으로 해결할 수 있습니까? 공유하십시오. 그러나이 특별한 경우에는 extern "C"라고 말하는 것이 유용 할 것입니다.)) thx컴파일러에서 C 이름을 C++ 이름으로 변경하는 방법

+1

C 함수 * 모든 것을 C++ 멤버 함수로 링크해야합니다. * ?? 실제로, * this * 포인터를 포함하여? 어떻게 그렇게 될수 있니? AFAIK C는 * this *에 대해 알지 못합니다. – Walter

+0

첫 번째 매개 변수로 지정했기 때문에 – Pyjong

+0

실제 질문을하지 않습니다. C++로 작성해야 할 이유가 있습니다. 보통'this'가 각 메소드의 첫 번째 인자로'void * '로 추가 될 때 C++ 클래스를 작성하여 c 인터페이스로 감싸줍니다. – SHR

답변

7

(C 기반) 오브젝트 파일에는 심볼이 있으며 그 심볼을 다른 이름으로 다시 정의 할 수 없습니다. 해당 오브젝트 파일을 생성하는 컴파일러의 작업이되어야합니다. C 컴파일러는 C++에 대해 알지 못하므로 C++ 링키지 및 이름 맹 글링으로 심볼을 생성 할 수 없습니다. 따라서 해당 기호 (C 함수)를 사용하는 유일한 방법은 알고있는 기호로 기호를 호출하는 것입니다.

당신은 물론, (멤버) 함수와 같이 (간접의 추가 레벨이 떨어져 전화가 inline입니다 경우 을 최적화) ++는 C를 구현 해당 기능을 사용할 수 있습니다

extern "C" { int my_C_func(void*, int); } // could be in an included header 

struct A { 
    // implement the followind member using the C function 
    int operator()(int i) { return my_C_func(this,i); } 
}; 

C++ 클래스가 이미 선언되었고 해당 선언에 손댈 수없는 경우에도 별도의 소스 파일에서 동일한 방식으로 멤버 함수를 구현할 수 있습니다. 그러나,이 inline 수 없으며, 따라서 추가 함수 호출의 비용에 온다 : 나에게 회신에서

in file.cpp: 

extern "C" { int my_C_func(void*, int); } // could be in an included header 
int A::operator()(int i) { return my_C_func(this,i); } 

난 당신이 실제로 C 함수의 구현을 제어 할 수 있다는 결론 주석 처리합니다. 그래서 왜 이것을 C에서 구현해야합니까? C++로 간단히 구현할 수없는 이유는 무엇입니까? 그런 다음 올바른 링키지 및 이름 맹글 링을 가져오고 원하는 멤버 함수를 직접 구현할 수 있습니다.

관련 문제