2010-01-16 6 views

답변

10

에 의해 패스를 사용

  1. 이들은 동일한 컴파일러로 컴파일됩니다. 모든 C++ 내보내기를 C 스타일 명명 규칙으로 내보내는 경우에는 필요하지 않지만 C++에서 두 C++ 모듈 사이의 클래스 인스턴스에 대한 C++ 호출이 필요합니다. 이는 다른 컴파일러가 C++ 내보내기를 다르게 mangle하기 때문에 필요합니다.

  2. C 구조체로 C++ 클래스를 형 변환하지 마십시오. 필드의 레이아웃이 같더라도 커버 아래에서 동일하지 않습니다. C++ 클래스에는 가상 멤버가 있으면 "v-table"이 있습니다. 이 v-table은 상속되거나 기본 클래스 메소드의 적절한 호출을 허용합니다.

  3. 이것은 C에서 C 또는 C++에서 C++뿐만 아니라 C에서 C++에도 해당됩니다. 두 가지 모두 출력 라이브러리에 대해 동일한 바이트 정렬을 사용해야합니다. 컴파일러 또는 개발 환경 문서를 읽음으로써 만이를 판별 할 수 있습니다.

  4. malloc/free를 new/delete와 함께 사용하지 마십시오. 좀 더 구체적으로 새로운 메모리와 "free"메모리를 할당하지 마십시오. 많은 컴파일러와 운영 체제가 두 메모리 관리 방식을 다르게 처리합니다.

  5. 전달 함수 포인터 : C++에서 "extern"으로 노출되는 한 C가 적합합니다. (하나의 파일에서 이것을 유지하기 위해 헤더가 컴파일 될 때 C 또는 C++로 컴파일 될 때를 결정하는 방법에 대한 컴파일러 문서를 참조해야하거나, 각 프로젝트에서 동일한 함수 선언의 두 개의 복사본이 필요합니다. 첫 번째를 추천하십시오)

  6. 2 중 패싱 : 이것은 C 및 C++에서 기본 제공되는 유형이므로 동일하게 처리해야합니다.

  7. C 함수로 C++ 개체의 인스턴스를 공유하고 C 코드 내에서 작업해야하는 경우 C++ 개체에서 적절한 메서드를 호출하는 C 내보내기 도우미 함수 집합을 노출하십시오. 순수한 C 코드는 C++ 객체의 메소드를 제대로 호출 할 수 없습니다.당신이 지역 사회에 도움이 될 것입니다 더 구체적인 질문이 예제 사용 사례를 제공하지만, 일반적으로 좋은 질문입니다

 

    Pseudocode-ish Example: 
    // C++ class 
    class foo { 
     public: 
      void DoIt(); 
    }; 

    // export helper declarations 
    extern "C" void call_doit(foo* pFoo); 
    extern "C" foo* allocate_foo(); 
    extern "C" deallocate_foo(foo* pFoo); 


    // implementation 
    void call_doit(foo* pFoo) 
    { 
     pFoo->DoIt(); 
    } 

    foo* allocate_foo() 
    { 
     return new foo(); 
    } 

    deallocate_foo(foo* pFoo) 
    { 
     delete pFoo; 
    } 

    // c consumer 
    void main() 
    { 
     foo* pFoo= allocate_foo(); 
     call_doit(pFoo); 
     dealocate_foo(pFoo); 
    } 

 
+0

아마도이 게시물을 읽을만한 가치가 있습니다 : http : // /stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code –

0

C 및 C++ 포인터는 동일합니다. 포인터는 기본적으로 메모리 블록을 가리키며 C/C++에서 변경되지 않습니다.

힙 유형을 넘지 않도록 조심해야합니다. 예를 들어 한 라이브러리에 할당하지 말고 다른 힙이 있거나 다른 런타임 버전을 사용하는 라이브러리에서 할당을 해제하십시오 (또는 그 반대) .

전달 기준 또는 전달 기준과 관련된 문제에 관해 문의 하시겠습니까? 보다 구체적인 질문을 제공하는 데 도움이 될 수 있습니다.

+0

함수에 대한 포인터는 무엇입니까? – adk

+0

C (와)과 같은 함수 포인터 (메소드는 아님)는 C와 같지만,'extern "C"'를 사용해 맹 글링하지 말아주세요. – psychotik

0
  • 통근자 "C" 이름을 엉망으로는 C++와 키워드 을 피하기 문제를 잊지 말아.
  • 그나마 당신이 내가 가진 가장 큰 문제 (Linux 및 기타 * 괜찬아 변종에 윈도우 공유 라이브러리에 DLL을) 두 개의 서로 다른 라이브러리를 정적 또는 동적으로 이러한 코딩하고 가정 참조 인수 유형하지만 포인터
관련 문제