2014-09-30 1 views
0

Why do we need extern "C"{ #include <foo.h> } in C++?을 읽은 후에 나는 extern "C"블록 내에 헤더를 포함하여 결론을 내렸다.혼합 C/C++ 헤더에 다른 혼합 헤더가 포함될 수 있습니까?

하지만이 별자리 문제로 실행 :

#ifdef __cplusplus 
extern "C" { 
#endif 

#include "mixedstuff.h" 

#ifdef __cplusplus 
} 
#endif 

mixedstuff.h :

사람이 볼 수 있듯이, 내가 cppstuff.h으로 돌아가 셨습니다
#ifdef __cplusplus 
extern "C" { 
#endif 

#include "cstuff.h" 

#ifdef __cplusplus 
} 
#include "cppstuff.h" 
#endif 

하면 extern "C" 내에서 C++ 컴파일러가 포함되지 블록. 많은 문이 C- 링크로는 불가능하기 때문에 많은 오류가 발생했습니다.

분명 솔루션은 extern "C" 블록 외부의 #include mixedstuff.h입니다. 그러나 이것은 내가 각 헤더를보고 그것이 평범한 지 알기를 요구한다. C, C++ 또는 혼합.

여기에서 extern "C"에 헤더를 포함하는 대신 헤더를 C++에서 인식하도록 권장합니다. 내가 맞습니까, 아니면 더 좋은 방법이 있습니까?

+0

__cplusplus의 첫 번째 사용이 불필요 : –

+0

그게 제가 "명백한 해결책"을 의미하는 것입니다. 나는 그러한 상황에 대한 최선의 관행을 요구하려고 노력했다. – Sascha

답변

2

설명에 따르면 mixedstuff.h은 으로 C와 C++ 모두에서 사용하도록 설계되었습니다. 즉, #ifdef __cplusplus 등이 있으며 여기에는 일부 순수 C++ 코드가 포함되어 있습니다. 그런 경우 이 아닌extern "C" 블록 안에 포함되어야합니다. 일반적으로 다르게 명시하지 않는 한 대부분의 헤더가 가장 바깥 쪽 수준에 포함되어야합니다. 모든 블록, 네임 스페이스 등이 예외입니다. 단 하나의 예외는 순수한 C 헤더입니다. 여기서 작성자는 라이브러리를 으로 사용하도록 설계하지 않았습니다. C++; 그것들은 extern "C" 블록 내에 포함되어야합니다. (그러나 내가 본 것에서 볼 때, 그러한 헤더는 덜 희박합니다. 및 희귀합니다.)

그리고 헤더를 들여다 볼 필요는 없습니다. 당신은 문서를 봐야합니다.

헤더의 작성자는 C++을 인식하도록 설정해야합니다 (라이브러리 수준에서이 사실을 문서화해야합니다). 포함하기 때문에

extern "C++" { 
#include "cppstuff.h" 
} 
1

예에서 extern "C"을 입력하라는 메시지가 표시되면 C 전용 헤더가 포함될 때입니다.

C 전용이므로 C 언어로 작성되었을 가능성이 있으므로 C++ 용으로 사용하려면 C 헤더로 지정해야합니다.

mixstuff.h이 있으면 C++ 전용 구조이므로 C에서 작동하지 않습니다. C 링키지로 갖고 싶은 C 구조체는 명시 적으로 mixstuff.h 안에 표시해야합니다. 또는 자신의 머리글로 분리하십시오.

mixstuff.h과 함께 mixstuff.c 또는 mixstuff.cpp이 컴파일되거나 아니면 두 개의 다른 컴파일 단위가 될 수 있습니다. 우리는 C++ 컴파일러로 구현체를 컴파일 할 수 있으며 C++ 구조체를 사용하여 C++ (C 링키지와 함께) 일 수도 있습니다 (종종 C++ 라이브러리에 C 인터페이스를 제공하기도합니다).

mixstuff이 원래 C++ 이름 맹 글링을 사용하여 C++로 빌드 된 경우 이제 선언문 주위에 extern "C"을 입력하면 코드와 연결되지 않습니다. 함수가 실제로 C 컴파일러에 의해 빌드 된 경우 extern "C"을 사용해야 만 볼 수 있습니다.

1

공통점과 차이점이있는 다양한 C 및 C++ 표준이 있습니다.

코드가 모든 대상 표준의 공통 교차점에 쓰여 있다면 코드를 전역 이름 공간에 포함하십시오.

C++에 포함 된 경우 extern "C"이 누락되면 외부로 포장하십시오.

그렇지 않으면 상황이 복잡 해지고 직접 패치해야합니다.

__cplusplus, __STDC_VERSION__ 및 기타 기능 및 언어 테스트 매크로 조건을 가진 전처리 기는 일반 언어 자체가 보장하는 조건보다 더 광범위한 조건에서 올바르게 동작하는 코드를 작성하는 방법입니다.

현명하게 사용하면 오용하기 쉽습니다.

+0

+1 "현명하게 사용하면 오용이 쉽습니다." 나는 extern "C"에 대해 약간의 내용을 읽었으며 그러한 경고의 말을 발견하지 못했습니다. – Sascha

1

당신이 물건을 확인하려면

는 C++ 링크가 포함 된 헤더 파일이 extern "C" 블록 내부에 포함 될 수있다하더라도, 당신은 extern "C++" 블록을 사용할 수있다 .h 파일은 이미 처리합니다. 당연히 문제를 해결합니다. 너무 많이 도와주지 마십시오.
관련 문제