왜 'extern“C ++”'를 사용합니까?
이 기사 에서 키워드 extern 뒤에 "C"또는 "C ++"가 올 수 있습니다. 왜 'extern "C ++"'를 사용합니까? 실용적입니까?
언어는 다음을 허용합니다.
extern "C" {
#include "foo.h"
}
foo.h에 C ++ 연결이 필요한 것이 있으면 어떻게됩니까?
void f_plain(const char *);
extern "C++" void f_fancy(const std::string &);
이것이 링커를 행복하게 유지하는 방법입니다.
사용할 실제 이유가 없습니다 extern "C++"
. 단순히 암시 적 기본값 인 연결을 명시 적으로 만듭니다. 일부 멤버가 extern "C"연결이있는 클래스가있는 경우 다른 멤버가 extern "C ++"라는 명시적인 상태를 원할 수 있습니다.
C ++ 표준은 구문 적으로 정의합니다 extern "anystring"
. extern "C"
및에 형식적인 의미 만 제공 extern "C++"
합니다. 컴파일러 공급 업체는 자유롭게 정의 extern "Pascal"
하거나 extern "COM+"
원하는 경우 에도 가능 합니다.
왜 그렇게해야하는지 잘 모르겠지만 Sun 의이 기사 에 따르면 extern "C"블록 내에서 extern "C ++"를 사용하여 "C"함수 그룹에서 특정 함수를 지정할 수 있습니다. 네이티브 C ++ 연결.
extern "C" {
void f(); // C linkage
extern "C++" {
void g(); // C++ linkage
extern "C" void h(); // C linkage
void g2(); // C++ linkage
}
extern "C++" void k();// C++ linkage
void m(); // C linkage
}
두 가지 추측 :
extern "C"
블록 에있는 경우 중첩 된을 지정하여 C ++ 언어 연결을 다시 가져올 수 있습니다extern "C++"
.C++
C ++를 정의하는 문서이기 때문에 링크를 예약 합니다.C++
언어 연결 을 정의하는 데 자신보다 더 나은 위치에있는 사람은 누구입니까 ? 또한 완전성을 제공합니다. 와 같은 거래입니다signed/unsigned
.
설명하는 이 답변 을 읽으십시오 extern "LanguageName"
(예 : GCC가 extern "Java"
).
Extern "C"는 많은 사람들이 대답합니다. extern "C ++"의 사용 사례는 C 함수에서 C ++ 라이브러리 함수를 호출 할 때입니다. 관련된 하위 사용 사례는 C ++ 라이브러리를 주 함수가있는 C 소스 코드와 연결할 때입니다. 자세한 내용은 이 위키 페이지 를 확인하십시오.
C와 C ++는 서로 다른 이름 맹 글링 규칙을 사용 합니다. 본질적으로 extern "C"는 C ++ 컴파일러에게 C가 이름을 지정하는 것처럼 함수 이름을 지정하도록 지시합니다.
사용할 링크 규칙을 지정합니다. 대부분의 언어는 "C"스타일 함수와 연결하는 방법을 알고 있습니다.
두 가지 경우에 필요합니다.
- AC-또는 C ++로 작성된 함수를 호출하는 해당 문제 프로그램에 대한 다른 언어
- C로 작성된 함수를 호출하는 C ++ 프로그램
예 :
// declared in function.h
void f1(void);
개체 테이블의 이름이 C ++ 규칙을 사용하기 때문에 C 코드 (실제로 다른 언어가 C 함수와 연결할 수 있음)는 연결할 수 없습니다.
당신이 쓰면
extern "C" void f1(void);
이제 연결은 C 규칙을 사용하기 때문에 작동합니다.
제가 extern "C"를 사용하는 가장 큰 이유는 C ++의 이름 변경 규칙을 피하기 위해서입니다. .Net 언어로 작업 중이고 특정 기본 함수로 PInvoke를 수행하려는 경우 이는 매우 중요합니다. 이를 수행하는 유일한 방법은 이름 맹 글링을 비활성화하는 것입니다.
짧은 대답은 extern C를 사용하여 컴파일러에게 이름 변경을 사용하지 않도록 지시 할 수 있다는 것입니다. 즉, 동일한 프로젝트에서 C 및 C ++ 코드의 비트를 함께 연결할 수 있습니다.
extern "C"는 C ++ 함수에 C 연결이 있어야 함을 나타내는 데 사용됩니다. 이것이 의미하는 바는 구현에 따라 다르지만 일반적으로 C ++ 이름 맹 글링을 해제합니다 (따라서 오버로딩 및 엄격한 유형 검사). C 코드에서 호출하려는 C ++ 함수가있을 때 사용합니다.
extern "C" void Foo(); // can be called easily from C
extern "C ++"의 경우 C ++ 표준에서 허용하지만 실제 코드에서는 본 적이 없습니다. 나는 그것이 안되는 것 같아요.
참고 URL : https://stackoverflow.com/questions/610934/why-would-you-use-extern-c
'program story' 카테고리의 다른 글
캐스팅하지 않고 짧은 int 리터럴을 지정하는 방법은 무엇입니까? (0) | 2020.11.07 |
---|---|
범위에 텍스트 설정 (0) | 2020.11.07 |
하위 문자열 색인 범위 (0) | 2020.11.07 |
Rails 3 / 모델이없는 양식 : 모델에 연결되지 않은 양식을 작성하려면 어떻게해야합니까? (0) | 2020.11.07 |
Python 2 print 문에 비해 Python 3.x의 새로운 인쇄 기능의 장점은 무엇입니까? (0) | 2020.11.07 |