2012-07-10 5 views
0

클래스 및 템플릿을 사용하는 C++ 라이브러리 lib.h가 있다고 가정합니다.라이브러리와 c 및 C++ 연결

#include "lib.h" 

    //call methods from lib.h that use templates and classes 
    // and return an integer based off of the information gained from calling functions lib.h 
    extern "C" int foo(int param1, const int param2); 

지금 나는 C 파일이라고 test.c.에서 오전 가정 : 나는 다음과 사용자 정의 C++ 헤더 myLink.h을 가지고 또한 가정 함수 foo()를 다음과 같이 호출하는 것이 합법적입니까?

//in test.c 
int first = foo(5, 6); 

또한 컴파일의 개체 코드/링커 단계에서 무엇이 진행되고 있습니까?

감사합니다.

+2

"myLink.h"를 C 및 C++ 모두에서 컴파일 할 수 있도록 할 수 있습니다. '#ifdef __cplusplus'를 사용하여'extern "C"{'와'}'를 별도의 줄로 감싼다. 그렇게하면'int foo (int param1, const int param2); 부분이 일반 C 코드에서 볼 수 있고 나머지는 C++에서 볼 수 있습니다. 이것이 없으면 "test.c"는 함수를 선언하는 별도의 방법이 필요합니다. –

답변

0

함수 foo()를 다음과 같이 호출하는 것이 합법적입니까?

int first = foo(5, 6); 

예, 그것은 법적이다. 이 법적 통화가 연결되는지 확인하려면 아래 내용을 읽어야합니다.

컴파일의 대상/코드 단계에서 어떤 일이 벌어지고 있습니까?

클래스 사용은 방해하지 않습니다. C++ 클래스는 링커가 이해할 수있는 객체 코드로 컴파일됩니다. 크리스 도드의 코멘트에서

편집은 :

템플릿은 그들을 호출 foo의 미덕에 의해 생성됩니다.

+0

사실은 아니다 -'foo'가 어떤 템플릿을 사용한다면,'foo'를 정의하는 C++ 소스 파일을 컴파일 할 때 그것들은 인스턴스화 될 것이다. –

+0

@ChrisDodd : 네 말이 맞아! 감사. –

+0

아마도 C++ 인식 링커와 링크해야합니다. C++ 측에서 정적 객체에 액세스하거나 예외 처리를 사용하는 코드 또는 C++ 관련 초기화 코드를 필요로하는 기타 여러 가지 코드가있을 수 있습니다. – sfstewman

관련 문제