C 프로그램에서 C++ 라이브러리로 돌아가서 struct, double, functions에 대한 포인터를 전달하는 데 유용한 팁이 있습니까?C에서 C++로 또는 그 반대로 포인터를 전달하는 경우
답변
에 의해 패스를 사용
이들은 동일한 컴파일러로 컴파일됩니다. 모든 C++ 내보내기를 C 스타일 명명 규칙으로 내보내는 경우에는 필요하지 않지만 C++에서 두 C++ 모듈 사이의 클래스 인스턴스에 대한 C++ 호출이 필요합니다. 이는 다른 컴파일러가 C++ 내보내기를 다르게 mangle하기 때문에 필요합니다.
C 구조체로 C++ 클래스를 형 변환하지 마십시오. 필드의 레이아웃이 같더라도 커버 아래에서 동일하지 않습니다. C++ 클래스에는 가상 멤버가 있으면 "v-table"이 있습니다. 이 v-table은 상속되거나 기본 클래스 메소드의 적절한 호출을 허용합니다.
이것은 C에서 C 또는 C++에서 C++뿐만 아니라 C에서 C++에도 해당됩니다. 두 가지 모두 출력 라이브러리에 대해 동일한 바이트 정렬을 사용해야합니다. 컴파일러 또는 개발 환경 문서를 읽음으로써 만이를 판별 할 수 있습니다.
malloc/free를 new/delete와 함께 사용하지 마십시오. 좀 더 구체적으로 새로운 메모리와 "free"메모리를 할당하지 마십시오. 많은 컴파일러와 운영 체제가 두 메모리 관리 방식을 다르게 처리합니다.
전달 함수 포인터 : C++에서 "extern"으로 노출되는 한 C가 적합합니다. (하나의 파일에서 이것을 유지하기 위해 헤더가 컴파일 될 때 C 또는 C++로 컴파일 될 때를 결정하는 방법에 대한 컴파일러 문서를 참조해야하거나, 각 프로젝트에서 동일한 함수 선언의 두 개의 복사본이 필요합니다. 첫 번째를 추천하십시오)
2 중 패싱 : 이것은 C 및 C++에서 기본 제공되는 유형이므로 동일하게 처리해야합니다.
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);
}
아마도이 게시물을 읽을만한 가치가 있습니다 : http : // /stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code –
C 및 C++ 포인터는 동일합니다. 포인터는 기본적으로 메모리 블록을 가리키며 C/C++에서 변경되지 않습니다.
힙 유형을 넘지 않도록 조심해야합니다. 예를 들어 한 라이브러리에 할당하지 말고 다른 힙이 있거나 다른 런타임 버전을 사용하는 라이브러리에서 할당을 해제하십시오 (또는 그 반대) .
전달 기준 또는 전달 기준과 관련된 문제에 관해 문의 하시겠습니까? 보다 구체적인 질문을 제공하는 데 도움이 될 수 있습니다.
- 는 통근자 "C" 이름을 엉망으로는 C++와 키워드 을 피하기 문제를 잊지 말아.
- 그나마 당신이 내가 가진 가장 큰 문제 (Linux 및 기타 * 괜찬아 변종에 윈도우 공유 라이브러리에 DLL을) 두 개의 서로 다른 라이브러리를 정적 또는 동적으로 이러한 코딩하고 가정 참조 인수 유형하지만 포인터
- 1. 포인터를 통해 배열을 사용하는 경우 또는 그 반대로 사용하는 경우
- 2. JNI를 사용하여 Java에서 C로 또는 그 반대로 데이터 유형 전달
- 3. C에서 UNICODE_STRING을 ANSI로 변환하거나 그 반대로 변환
- 4. 새내기 질문입니다. C에서 함수에 포인터를 전달하는 방법?
- 5. HTML5 캔버스에서 XML로 또는 그 반대로
- 6. 루비 배열을 문자열로 또는 그 반대로 변환
- 7. MinGW에서 msysGit 사용 (또는 그 반대로)
- 8. 바이트 배열에서 문자열로 이미지 (또는 그 반대로)
- 9. Java에서 클래스를 문자열로 또는 그 반대로 캐스팅
- 10. c에서 동적 배열에 포인터를 비움
- 11. 북마크릿에서 Firefox 확장자에 액세스하는 방법 (또는 그 반대로)
- 12. PHP에서 Javascript 및 그 반대로 데이터 전달
- 13. 함수 C에서 포인터를 반환
- 14. 목표 C에서 함수 포인터를 C에 전달하는 것과 동일한 것은 무엇입니까?
- 15. C에서 C로 파일 전처리 이식
- 16. Ruby에서 float 숫자를 이진 문자열로 변환하는 방법 (또는 그 반대로)
- 17. 배열을 문자열로 또는 그 반대로 변환하는 방법은 무엇입니까?
- 18. 오디오, mp3 파일을 문자열로 또는 그 반대로 변환
- 19. 자바 스크립트에서 자바 스크립트로 (또는 그 반대로) 이전 가이드가 있습니까?
- 20. 클라이언트에서 서버로 스테 가노 그래픽 메시지 보내기 또는 그 반대로
- 21. 테이블에서 테이블 행 객체 가져 오기 또는 그 반대로
- 22. 보기가 potrait에서 landscape 또는 그 반대로 바뀔 때 작동하지 않음
- 23. 로컬 데이터베이스와 원격 데이터베이스 동기화 또는 그 반대로
- 24. 부호없는 바이트를 부호있는 바이트로 또는 그 반대로 부호를
- 25. 바이너리에서 텍스트 모드로 또는 그 반대로 iostream을 전환하는 방법은 무엇입니까?
- 26. .net C#을 PHP로 또는 그 반대로 변환하는 방법은 무엇입니까?
- 27. 로컬 클라이언트 시스템 시간에서 CST로 또는 그 반대로 변환
- 28. OpenCV에서 RGB로 YCbCr로 또는 그 반대로 손으로 (Visual C++)
- 29. 컴파일러가 정수를 문자열로 또는 그 반대로 변환하는 방법
- 30. 함수에 C 포인터를 전달하는 방법?
은 최고의 조언을 제공합니다. –