수색…


소개

링키지 사양은 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_fooextern "C" 블록 안에 있고 컴파일러는 unmangled 이름 및 C 호출 규칙을 사용하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow