레거시 C 코드 가 많은 프로젝트를 진행 중입니다 . 우리는 결국 레거시 코드를 변환하려는 의도로 C ++로 작성하기 시작했습니다. C 와 C ++의 상호 작용 방식에 대해 약간 혼란스러워합니다 . 나는 포장하여 해당 이해 C를 사용하여 코드를 extern "C"
망글하지 않습니다 컴파일러 ++은 C 의 C 코드의 이름을,하지만 난 완전히 확인이 구현하는 방법을 모르겠어요.
따라서 각 C 헤더 파일 의 상단 (포함 가드 후)에는
#ifdef __cplusplus
extern "C" {
#endif
그리고 맨 아래에
#ifdef __cplusplus
}
#endif
이 둘 사이에는 include, typedef 및 함수 프로토 타입이 모두 있습니다. 이것을 올바르게 이해하고 있는지 확인하기 위해 몇 가지 질문이 있습니다.
C 헤더 파일 Bh를 포함하고 다른 C 헤더 파일 Ch 를 포함하는 C ++ 파일 A.hh 가 있으면 어떻게 작동합니까? 컴파일러가 Bh로 들어가면
__cplusplus
정의되어 코드를 래핑합니다extern "C"
(__cplusplus
이 블록 안에 정의되지 않음). 따라서 Ch로 들어가면__cplusplus
정의되지 않으며 코드가 래핑되지 않습니다extern "C"
. 이 올바른지?코드 조각을 래핑하는 데 문제가
extern "C" { extern "C" { .. } }
있습니까? 두 번째extern "C"
는 무엇을 할 것인가?이 래퍼는 .c 파일 주위에 배치하지 않고 .h 파일에만 배치합니다. 함수에 프로토 타입이 없으면 어떻게됩니까? 컴파일러는 이것이 C ++ 함수라고 생각합니까?
또한 C 로 작성된 타사 코드를 사용하고 있으며 이러한 종류의 래퍼가 없습니다. 해당 라이브러리의 헤더를 포함 할 때마다
extern "C"
#include를 둘러 쌉니다. 이것이 올바른 처리 방법입니까?마지막으로, 이것이 좋은 아이디어입니까? 우리가해야 할 다른 일이 있습니까? 우리는 가까운 미래에 C 와 C ++를 혼합 할 예정이며, 모든 기반을 다룰 것입니다.