수색…
소개
링키지 사양은 C와 같은 다른 언어로 작성된 선언과 함께 선언 할 수 있도록 선언을 컴파일하도록 컴파일러에 지시합니다.
통사론
- extern 문자열 리터럴 { 선언 -seq ( opt )}
- extern 문자열 - 리터럴 선언
비고
이 표준은 모든 컴파일러가 C ++과 C와의 호환이 가능하도록 extern "C"
를 지원하고, extern "C++"
링키지 사양을 무시하고 기본값을 복원하는 데 사용할 수있는 extern "C++"
합니다. 지원되는 다른 링키지 사양은 구현에 따라 정의됩니다 .
유닉스 계열 운영체제 용 시그널 핸들러
시그널 핸들러는 C 호출 규칙을 사용하여 커널에 의해 호출되기 때문에, 함수를 컴파일 할 때 C 호출 규칙을 사용하도록 컴파일러에 알려야합니다.
volatile sig_atomic_t death_signal = 0;
extern "C" void cleanup(int signum) {
death_signal = signum;
}
int main() {
bind(...);
listen(...);
signal(SIGTERM, cleanup);
while (int fd = accept(...)) {
if (fd == -1 && errno == EINTR && death_signal) {
printf("Caught signal %d; shutting down\n", death_signal);
break;
}
// ...
}
}
C 라이브러리 헤더를 C ++과 호환 가능하게 만들기
AC 라이브러리 헤더는 대개 C ++ 프로그램에 포함될 수 있습니다. 대부분의 선언은 C 및 C ++에서 모두 유효하기 때문입니다. 예를 들어, 다음 foo.h
고려하십시오.
typedef struct Foo {
int bar;
} Foo;
Foo make_foo(int);
make_foo
의 정의는 객체 형식으로 헤더와 함께 개별적으로 컴파일되고 배포됩니다.
C ++ 프로그램은 #include <foo.h>
할 수 있지만 컴파일러는 make_foo
함수가 C 심볼로 정의되어 있는지를 모르고, 아마도 맹 글링 된 이름으로 찾아보고 그 위치를 찾지 않을 것입니다. 라이브러리에서 make_foo
의 정의를 찾을 수 있다고해도 모든 플랫폼이 C 및 C ++에 대해 동일한 호출 규칙을 사용하는 것은 아니며 C ++ 컴파일러는 make_foo
호출 할 때 C ++ 호출 규칙을 사용하므로 make_foo
C 호출 규칙으로 호출 될 것으로 예상됩니다.
이 문제를 해결하는 방법은 헤더의 extern "C"
블록에서 거의 모든 선언을 래핑하는 것입니다.
#ifdef __cplusplus
extern "C" {
#endif
typedef struct Foo {
int bar;
} Foo;
Foo make_foo(int);
#ifdef __cplusplus
} /* end of "extern C" block */
#endif
이제 foo.h
가 C 프로그램에서 포함되면 일반 선언으로 나타납니다. 그러나 foo.h
가 C ++ 프로그램에서 포함되면 make_foo
는 extern "C"
블록 안에 있고 컴파일러는 unmangled 이름 및 C 호출 규칙을 사용하십시오.