2011-03-30 3 views

답변

5

일반적으로, 당신은, 그러나

C.

에 라이브러리가 그들 extern "C"를 선언함으로써, C 프로그램에 그 기능의 일부를 수출하도록 선택할 수 있습니다 ++은 C를 C++ 기능을 사용할 수 없습니다. C++ 라이브러리가이 작업을 수행하지 않으면 이렇게하는 래퍼 (C++)를 작성해야합니다.

이러한 내 보낸 기능은 C의 제한 사항을 준수해야합니다. 예를 들어 POD가 아닌 유형, 함수 오버로딩, 연산자 오버로딩, 변환 연산자, RTTI, 예외, 템플릿 등을 사용할 수 없습니다.

1

Chris Jester-Young은 말했듯이 직접 사용할 수 없습니다. 그러나 C++에서 기능을 일반 c 함수로 내보내는 래퍼를 작성할 수 있습니다.

기본적으로 핸들 (예 :이 포인터를 int로), Destroy-Method (예 : DestroyVector)를 사용하여 핸들을 가져 와서 개체를 삭제하는 Create-Method (예 : CreateVector)를 작성합니다. 그런 다음 개체의 각 멤버 메서드를 래핑해야합니다. 래퍼 메서드에는 핸들러라는 추가 인수가 필요하다는 점을 제외하면 동일한 시그니처가 있습니다.

이것은 - 반복되는 작업의 양을 감싸는 방법에 따라 다릅니다. 그러나 쉬운 일입니다. "핸들을 사용한 C의 객체 지향 프로그래밍"의 예를 보려면 Windows-API를 살펴보십시오.

0

사용할 C++ 함수 주위에 extern "C" 래퍼 함수를 ​​만들어야합니다. 이 단계에서는 원하는 기능의 이름을 수동으로 선택해야합니다.

//Header file: 

#ifdef __cplusplus 
extern "C" { 
#endif 

int *find_int(int *first, int *last, int value); 

#ifdef __cplusplus 
} 
#endif 

//C++ source file: 

int *find_int(int *first, int *last, int value) { 
    return std::find(first, last, value); 
} 

는 (정적 또는 동적) 라이브러리에이 컴파일하거나 빌드 환경의 작동 방식을 따라 프로젝트에서 C 소스 코드를 함께 넣어.

+1

std :: find가 작동하지만 C main() 함수가있는 프로그램에서 C++ 런타임이 제대로 초기화되었다고 보장 할 수 없습니다. –

+1

@Bo : 사실이에요. 특히 iostream은 작동하지 않습니다. 물론,'main'을 C++ 파일에 넣기가 쉽습니다. – Potatoswatter

관련 문제