2009-02-08 5 views
5

C로 작성된 일부 코드 위에 (내 첫 번째) C++ 클래스를 작성하고 있지만 extern 블록에서 C 함수를 선언하여 컴파일하는 C++ 만 얻을 수 있습니다. 내 프로젝트는 자동 도구를 사용합니다. 이 프로세스를 자동화 할 수있는 방법이 있나요? 그래서 두 개의 헤더 파일을 유지할 필요가 없습니까?autotools를 사용하여 C++에서 C 코드 사용

//Wrapper.h 
#ifdef __cplusplus 
extern "C" 
{ 

    #include "Actual.h" 
} 
#else 
    #include "Actual.h" 
#endif 


//Use.cpp 
#include "Wrapper.h" 

int main() 
{ 
    return 0; 
} 

//Use.c 
#include "Wrapper.h" 
/*or #include "Actual.h" */ 

int main() 
{ 
    return 0; 
} 

답변

3

는 ... 헤더 파일의 파일

시작 헤더

#ifdef __cplusplus 
extern "C" { 
#endif 
... 그리고 헤더 파일의 끝 부분에

#ifdef __cplusplus 
} 
#endif 

이렇게하면 C 및 C++ 소스에 모두 포함될 수 있습니다.

+0

감사합니다. 매우 감사. – drkatz

+0

이것은 확실히 작동하지만 아래의 훨씬 더 높은 등급의 대답이 더 좋습니다 - 실제 헤더 파일의 전 처리기를 사용하여 'extern "C"'함수를 선언하십시오. 그렇게하면 C 및 C++에서 헤더를 동일한 방식으로 포함 할 수 있으므로 추가 "래퍼"헤더에 대해 걱정할 필요가 없습니다. –

+0

참이지만 실제 헤더를 수정할 수없는 경우에는 어떻게해야합니까? 소스가 유지 관리되지 않는 제 3 자/다른 프로젝트에서 얻은 것이라면 어떻게 될까요? –

15

는 C 코드에 #ifdef와 내부 통근 블록을 사용 예는 다음처럼 C 헤더 파일을 포함 래퍼 헤더 파일을 생성

1

C 사전 처리기를 사용하십시오. 같은 것을 할 :

#ifdef __cplusplus 
extern "C" { 
#endif 
// code goes here 

#ifdef __cplusplus 
} 
#endif 
1

우리는 헤더 파일에 매크로가 : 헤더 파일에서 다음

#ifdef __cplusplus 
    #define _crtn "C" 
#else 
    #define _crtn 
#endif 

을, 우리는 _crtn 사용할 수 있습니다

#include "croutine.h" 

extern _crtn void MyFunction(...); 

유일한 잡았다가있다 MyFunction의 프로토 타입을 포함하는 헤더 파일을 MyFunction의 구현이 들어있는 파일에 포함 시켜서 "C"링키지로 컴파일하도록하십시오.

이것은 @ epatel의 답변과 동일하지만 하나의 헤더 파일에만 추악한 #ifdef이 필요합니다.

+0

거의 알려지지 않은 사실 : 함수를 extern "C++"로 선언 할 수 있습니다. C++로 컴파일 할 때 기본값이고 C++ 컴파일러에서 C++을 컴파일 할 수 없기 때문에 무의미합니다. 하지만 가상의 C++ + + 언어에 대해서는 앞으로 유용 할 수 있습니다. –