C++ 코드는 함수가 C 함수임을 알고 있어야합니다. 상황에 맞는 현실적인 예는 것
extern "C" [prototype];
: 이렇게하려면, 당신은 이런 식으로 선언 할 필요가
extern "C" void perlinTest();
그 이유는 C++ function names are mangled 그의 유형에 대해 알려줍니다 뭔가있다 매개 변수 가장 낮은 레벨에서는 오버로드가 허용됩니다. 즉, 같은 이름을 가진 두 개의 표시 가능한 심볼을 가지는 것이 합법적 인 것은 아니므로 C++은 함수 이름에 매개 변수의 유형을 나타내는 마커를 포함함으로써 해당 심볼을 허용합니다. 예를 들어 void perlinTest()
은 내 라이온 상자에 g++
(아마도 clang++
)으로 _Z10perlinTestv
으로 맹 글링되어 있지만 ABI와 관련이 있으며 다른 플랫폼에서는 동일하지 않습니다.
그러나 C는 오버로드를 지원하지 않으며 함수는 이름 맹 글링의 영향을받지 않으므로 C++ 코드가 전화를 걸려고 할 때 맹 글링 된 이름을 사용해서는 안된다는 것을 알아야합니다. 이것은 extern "C"
이 컴파일러에게 알려주는 것입니다. 헤더 파일은 C와 C++에서 읽을 수해야하는 경우
, 일반적인 관행은 extern "C"
블록 (extern "C" { /* declarations */ }
) 자체가 #ifdef __cplusplus
처리기 지시문에 싸여 (그래서 C 코드가 extern "C"
이 표시되지 않는 그들을 래핑하는 것입니다 암호).
#ifdef __cplusplus
extern "C" {
#endif
/* header body */
#ifdef __cplusplus
}
#endif
또한 해당 기능을 제공하는 라이브러리와 링크해야합니다. – Mat
이것은 도서관이 아닙니다. 나는 c 함수와 그것을 호출하는 C++ 코드를 작성했다. – Xavier
그런 다음 C 코드가 컴파일되고 C++ 코드와 링크되어 있는지 확인해야합니다. – Mat