IT

외부 "C"를 간단한 단어로 언제 사용합니까?

itgroup 2023. 7. 22. 09:55
반응형

외부 "C"를 간단한 단어로 언제 사용합니까?

C와 C++의 차이점을 이해하지 못했을 수도 있지만, 언제 그리고 왜 우리는 사용해야 합니까?

extern "C" {

분명히 그것은 "연계 협약"입니다.

나는 그것에 대해 간단히 읽었고 MSVS에 포함된 모든 .h 헤더 파일이 그들의 코드를 둘러싸고 있다는 것을 알아차렸습니다."C++ 코드"가 아닌 "C 코드"는 정확히 어떤 유형의 코드입니까?C++에 모든 C 코드가 포함된 줄 알았는데요?

저는 이것이 사실이 아니며 C++이 다르고 표준 기능이 둘 다 아니라 둘 다 존재하지만(즉, printf는 C이고 cout은 C++) 외부 "C" 선언을 통해서도 C++은 역호환성이 있다고 생각합니다.이거 맞는건가요?

제 다음 질문은 첫 번째 질문에 대한 대답에 달려 있지만, 어쨌든 여기서 묻겠습니다.C로 작성된 MSVS 헤더 파일이 외부 "C" {...}에 둘러싸여 있기 때문에, 독자적인 코드에서 이 파일을 직접 사용해야 하는 경우는 언제입니까?만약 당신의 코드가 C 코드이고 당신이 C++ 컴파일러로 컴파일하려고 한다면, 당신이 포함하는 모든 표준 h 파일은 이미 C++ 컴파일러와 함께 외부 "C" 항목을 포함하고 있기 때문에 문제없이 작동해야 하지 않나요?

당신은 C++로 컴파일할 때 이것을 사용해야 하지만 이미 구축된 C 라이브러리나 다른 것에 링크해야 합니까?

은 야합다니해를 사용해야 .extern "C"C에서 구현/컴파일된 함수를 선언할 때 C++로 표시됩니다.extern "C"컴파일러/링커에 C++ 이름 망글링 및 C++ 호출 규칙 대신 C 명명 및 호출 규칙을 사용하도록 지시합니다.라이브러리에서 .extern "C"잘 작성된 라이브러리는 이미 C와 C++로 내보내는 공용 API용으로 이 기능을 가지고 있을 것입니다.그러나 C와 C++에서 모두 사용할 수 있도록 라이브러리를 작성하는 경우에는 조건부로 헤더에 라이브러리를 넣어야 합니다.

모든 C 코드가 C++ 코드인지 아닌지에 대해서는...아니요, 그것은 정확하지 않습니다.C++이 "C의 슈퍼셋"이라는 것은 대중적인 신화입니다.C++는 확실히 C와 가능한 한 호환되도록 노력하지만 몇 가지 비호환성이 있습니다.예를 들어, bool은 유효한 C++이지만 유효한 C는 아닌 반면 _Bool은 C99에 있지만 C++에서는 사용할 수 없습니다.

외부 "C"를 시스템의 ".h" 파일과 함께 사용할 필요가 있는지 여부...잘 설계된 구현에는 사용자를 위해 이러한 기능이 포함되어 있으므로 사용자가 이러한 기능을 사용할 필요가 없습니다.그러나 이러한 파일이 제공되는지 확인하려면 "c"로 시작하고 ".h"를 생략하는 동일한 헤더 파일을 포함해야 합니다.예를 들어 <ctype>을 포함하는 경우입니다., 거의 모든 합리적인 시스템은 외부 "C"를 추가합니다. 그러나 C++ 호환 헤더를 보장하려면 헤더 <cctype>을 포함해야 합니다.

C++ FAQ Lite에서 C와 C++를 혼합하는 것에도 관심이 있을 수 있습니다.

다른 답은 맞지만, 완전한 "보일러 플레이트" 예제가 도움이 될 것입니다.C 및/또는 C++ 프로젝트에 C 코드를 포함하는 표준 방법은 다음과 같습니다.

//
// C_library.h
//

#ifdef __cplusplus
extern "C" {
#endif

//
// ... prototypes for C_library go here ...
//

#ifdef __cplusplus
}
#endif

-

//
// C_library.c
//

#include "C_library.h"

//
// ... implementations for C_library go here ...
//

-

//
// C++_code.cpp
//

#include "C_library.h"
#include "C++_code.h"

//
// ... C++_code implementation here may call C functions in C_library.c ...
//

참고: 위의 내용은 Objective-C++에서 C 코드를 호출하는 경우에도 적용됩니다.

C++ 컴파일러는 기호 테이블의 이름을 C 컴파일러와 다르게 망글합니다.은 사을용합니다야를 해야 합니다.extern "C"C++ 컴파일러에게 심볼 테이블을 빌드할 때 대신 멩글링 규칙을 사용하도록 지시하는 선언입니다.

저는 C++ dll 함수를 내보낼 때 C#이 추가 이름 망글링을 하지 않고도 C++ 코드를 읽을 수 있도록 'external c'를 사용합니다.그렇지 않으면 dll에서 C++ 함수에 제대로 액세스하기 위해 C# 측 함수 진입점 끝에 추가해야 하는 비논리적(또는 실제로는 영어가 아닌) 문자가 추가됩니다.

extern "C" {}blocks는 C++ 컴파일러에게 C 명명 규칙과 호출 규칙을 사용하도록 지시합니다.이것을 사용하지 않으면 C++ 프로젝트에 C 라이브러리를 포함하려고 하면 링커 오류가 발생합니다. 왜냐하면 C++는 이름을 망치기 때문입니다.C++ 프로젝트에서 사용할 경우를 대비하여 모든 C 헤더에 이 기능을 사용하는 경향이 있습니다.

#ifdef __cplusplus
extern "C" {
#endif

/* My library header */

#ifdef __cplusplus
} // extern
#endif

은 야합다니해를 사용해야 .extern "C"당신이 C++ 컴파일러에 의해 컴파일된 코드에서 C 호출 규약을 사용하고 싶을 때.두 : 가 지 이 유 있 습 니 다 가 두 니 다 있 습 ▁there ▁for 두유 지

  • 당신은 C에서 구현된 함수를 가지고 있으며 C++에서 호출하려고 합니다.

  • 당신은 C++에서 구현된 함수를 가지고 있으며 C에서 호출하려고 합니다.이 경우 함수 인터페이스에서 C++의 C 부분만 사용할 수 있습니다(클래스 없음, ...).

C 외에도 C와 동일한 호출 및 명명 규칙을 사용하는 C++ 언어와 다른 언어 간에 상호 운용을 원할 때도 이 기능이 적용됩니다.

일반적으로 C 헤더 파일의 선언은 다음으로 둘러싸여 있습니다.

#ifdef __cplusplus
extern "C" {
#endif

[... C declarations ...]

#ifdef __cplusplus
}
#endif

C++에서 사용할 수 있도록 하기 위해.

C++ 함수는 이름 망글링의 대상이 됩니다.이것은 그들이 C 코드에서 직접 전화하는 것을 불가능하게 만듭니다.extern "C"사용됩니다.

언급URL : https://stackoverflow.com/questions/2796796/when-to-use-extern-c-in-simple-words

반응형