2011-08-20 7 views
4

.cpp 파일이 있다고 가정합니다 (즉, MSVC와 같은 C++ 컴파일러를 사용하여 컴파일 됨). 이 파일에서 다음과 같은 방법으로 struct을 정의C/C++ struct 질문

같은 파일에서
struct Pixel 
{ 
    float x, y; 
}; 

, 당신은 Pixel에 해당하는 C struct을 필요로하는 C 함수를 호출하는 코드의 라인을 가지고있다. 쓰는 경우 :

Pixel my_pixel 
// set my_pixel to something 
c_func(&my_pixel); 

그것은 작용할 것입니까? 내 말은, C++ 컴파일러는 객체 my_pixel을 만들지 만, C 코드로 컴파일 된 함수에 전달합니다 (그 라이브러리의 .lib 만 있습니다).

+0

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.8 –

+2

바로 다음 FAQ로 한 후 통근 C의 블록에 포함 조나단이 OP의 질문에 직접 대답했습니다. "그게 효과가 있니?" "때때로"입니다. 이 경우'struct Pixel'이 POD 클래스라는 점을 감안하면 대답은 "Yes"여야합니다. –

+2

SO에 대한 질문과 비슷하게 들립니다. – haylem

답변

5

헤더 파일이 올바른 경우 C 컴파일러와 C++ 컴파일러가 호환되는 호출 규칙을 사용한다고 가정하면 작동합니다. 헤더 파일에 함수 정의가 들어있는 적절한 extern "C" 블록이 있는지 확인하십시오.

1

David Schzwartz가 extern "C" 블록이 필요하다고 말한 이유는 extern "C"블록이 없으면 컴파일러는 호출하는 C 함수의 이름을 "mangle"합니다. C++ 함수가 아닌 C 함수를 호출하는 경우 함수 라이브러리의 함수 정의에 변형 된 이름이 없으므로 실행 파일이 링크되지 않습니다.

호출하는 함수가 C++로 쓰여진 경우 이름 짓기에서 함수 이름 오버로딩이 가능하므로 원하는대로 할 수 있습니다. 함수 매개 변수의 각 유형은 변환 된 함수 이름으로 압축되어 있습니다.

이름 맹 글링은 원래 오버로드 된 기능을 명시 적으로 지원하는 C++ 특수 링커를 제공 할 필요없이 C++ 오브젝트 파일을 레거시 링커와 링크 할 수 있도록하기 위해 C++에서 제공되었습니다.

C는 함수 이름 오버로딩을 허용하지 않으므로 C 함수 이름은 절대로 mangle되지 않습니다. ++ 소스를 사용하면 C 함수 프로토 타입의 전체 전체 헤더 파일이 있고이 C에서 해당 헤더를 #include를하려면

extern "C" Foo(int theInt); 

의 #을 둘러싸 : 하나의 C 함수에 대한 C++에서 프로토 타입을 제공하기 위해이 작업을 수행

extern "C" { 
    #include "Foo.h" 
}