programing

C 코드에서 C++ 라이브러리 사용

shortcode 2022. 8. 16. 21:44
반응형

C 코드에서 C++ 라이브러리 사용

데이터 관리를 위한 다양한 클래스를 제공하는 C++ 라이브러리가 있습니다.도서관 소스코드가 있어요

C++ API를 확장하여 C 함수 호출을 지원하여 라이브러리를 C 코드와 C++ 코드로 동시에 사용할 수 있도록 하고 싶습니다.

GNU 툴 체인(gcc, glibc 등)을 사용하고 있기 때문에 언어 및 아키텍처 지원은 문제 없습니다.

이것이 기술적으로 불가능한 이유가 있나요?

가 조심해야 할 게 있나요?

이에 대한 리소스, 샘플 코드 및/또는 문서가 있습니까?


내가 발견한 몇 가지 다른 것들:

  1. C 코드에서 사용해야 하는 C++ 헤더를 랩하려면 다음 명령을 사용합니다.

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
  1. C에 포함되지 않은 개별 헤더 파일에 "실제" C++ 인터페이스를 유지합니다.여기서 PIMPL 원리를 생각해 보세요.사용.#ifndef __cplusplus #error어떤 광기를 감지하는 데 도움이 됩니다
  2. C++ 식별자는 C 코드의 이름으로 주의해 주세요.
  3. C 컴파일러와 C++ 컴파일러 사이즈가 다른 Enum.GNU 툴 체인을 사용하고 있다면 아마 문제가 되지 않을 것입니다만, 그래도 주의해 주세요.
  4. 구조물의 경우 C가 혼동하지 않도록 다음 형식을 따른다.

    typedef struct X { ... } X
    
  5. 그런 다음 포인터를 사용하여 C++ 객체를 전달합니다.이 포인터는 C에서 구조 X로 선언하면 됩니다.여기서 X는 C++ 객체입니다.

이 모든 것은 C++의 마법사인 친구의 호의입니다.

네, 이것은 확실히 가능합니다.C++ 에, C++ 로 기능을 선언하는 인터페이스 레이어를 쓸 필요가 있습니다.extern "C":

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

그럼, 당신이 전화할 것이다.foo()C 모듈로부터 콜을 전송한다.realFoo()C++에서 구현되는 함수입니다.

데이터 멤버와 메서드를 포함한 완전한 C++ 클래스를 공개해야 하는 경우 이 단순한 함수 예보다 더 많은 작업을 수행해야 할 수 있습니다.

C++ FAQ 라이트: "C와 C++ 코드를 혼재시키는 방법"

일부 gotcha는 다음 질문에 대한 답변으로 설명되어 있습니다.

  • [32.8] C++ 클래스의 오브젝트를 C 함수와 주고받는 방법
  • [32.9] C++ 클래스의 오브젝트에 있는 데이터에 C 함수가 직접 액세스 할 수 있습니까?

Main gotcha: 예외는 C에서 포착할 수 없습니다.C++ 코드에 예외가 발생할 가능성이 있는 경우는, C 코드 또는 C++ 래퍼를 신중하게 기입해 주세요.반대로 스택상의 C++ 오브젝트의 디스트럭터를 호출하기 위해서는 C 코드의 메커니즘(즉, 다양한 스크립트 언어에서 볼 수 있는)과 같은 예외는 필요하지 않습니다.

C/C++ 코드를 혼재시킬 수 있습니다.main()이 C++로 기능하는 경우 c 함수가 선언되어 있는지 확인하기만 하면 됩니다.

extern "C"

주값이 C인 경우 정적 변수를 제외하고 정상입니다.static 변수를 가진 컨스트럭터는 main()을 시작하기 전에 호출해야 합니다.C가 메인이면 이런 일은 없을 거예요.정적 변수가 많은 경우 정적 변수를 싱글톤으로 교체하는 것이 가장 좋습니다.

언급URL : https://stackoverflow.com/questions/199418/using-c-library-in-c-code

반응형