extern(C++)

extern 키워드(keyword) 전역 변수, 함수 또는 템플릿 선언에 적용될 수 있습니다. 기호 extern에 al 링크가 있음을 지정합니다. 연결에 대한 배경 정보와 전역 변수를 사용하지 않도록 하는 이유에 대한 자세한 내용은 번역 단위 및 연결을 참조 하세요.

extern 키워드(keyword) 컨텍스트에 따라 네 가지 의미가 있습니다.

  • 전역const 변수가 아닌 선언 extern 에서 변수 또는 함수가 다른 변환 단위에 정의되도록 지정합니다. extern 변수가 정의된 파일을 제외한 모든 파일에 적용해야 합니다.

  • const 변수 선언에서 변수에 external 링크가 있음을 지정합니다. 모든 파일의 extern 모든 선언에 적용해야 합니다. (전역 const 변수에는 기본적으로 내부 링크가 있습니다.)

  • extern "C" 는 함수가 다른 곳에서 정의되고 C 언어 호출 규칙을 사용한다고 지정합니다. extern "C" 한정자는 블록의 여러 함수 선언에도 적용될 수 있습니다.

  • 템플릿 선언 extern 에서 템플릿이 이미 다른 곳에서 인스턴스화되었음을 지정합니다. extern 는 현재 위치에 새 인스턴스를 만드는 대신 다른 인스턴스화를 다시 사용할 수 있다고 컴파일러에 알릴 수 있습니다. 이 사용에 extern대한 자세한 내용은 명시적 인스턴스화를 참조 하세요.

extern 전역이 아닌const 사용자에 대한 링크

링커는 전역 변수 선언 앞에 표시 extern 되면 다른 변환 단위에서 정의를 찾습니다. 전역 범위에서 변수const 가 아닌 선언은 기본적으로 알 수 있습니다 extern. 정의를 제공하지 않는 선언에만 적용 extern 됩니다.

//fileA.cpp
int i = 42; // declaration and definition

//fileB.cpp
extern int i;  // declaration only. same as i in FileA

//fileC.cpp
extern int i;  // declaration only. same as i in FileA

//fileD.cpp
int i = 43; // LNK2005! 'i' already has a definition.
extern int i = 43; // same error (extern is ignored on definitions)

extern 전역을 위한 const 링크

const 전역 변수에는 기본적으로 내부 링크가 있습니다. 변수에 al 링크가 있도록 extern하려면 정의 및 다른 파일의 extern 다른 모든 선언에 키워드(keyword) 적용합니다.

//fileA.cpp
extern const int i = 42; // extern const definition

//fileB.cpp
extern const int i;  // declaration only. same as i in FileA

extern constexpr 링크

Visual Studio 2017 버전 15.3 이하에서 컴파일러는 변수가 표시된 extern경우에도 항상 변수 내부 연결을 제공 constexpr 했습니다. Visual Studio 2017 버전 15.5 이상 /Zc:externConstexpr 에서 컴파일러 스위치는 올바른 표준 준수 동작을 사용하도록 설정합니다. 결국 옵션은 기본값이 됩니다. 이 /permissive- 옵션은 사용하도록 설정 /Zc:externConstexpr하지 않습니다.

extern constexpr int x = 10; //error LNK2005: "int const x" already defined

헤더 파일에 선언된 externconstexpr변수가 포함된 경우 중복 선언이 결합되도록 표시 __declspec(selectany) 되어야 합니다.

extern constexpr __declspec(selectany) int x = 10;

extern "C"extern "C++" 함수 선언

C++에서 문자열 extern 과 함께 사용되는 경우 다른 언어의 링크 규칙이 선언자에 사용되도록 지정합니다. C 함수 및 데이터는 이전에 C 링크가 있는 것으로 선언된 경우에만 액세스할 수 있습니다. 단, 별도로 컴파일된 변환 단위로 정의되어야 합니다.

Microsoft C++는 문자열 및 "C++"문자열 리터럴 필드를 지원합니다"C". 모든 표준 포함 파일은 구문을 사용하여 extern "C" C++ 프로그램에서 런타임 라이브러리 함수를 사용할 수 있도록 합니다.

예시

다음 예제에서는 C 링크가 있는 이름을 선언하는 방법을 보여줍니다.

// Declare printf with C linkage.
extern "C" int printf(const char *fmt, ...);

//  Cause everything in the specified
//  header files to have C linkage.
extern "C" {
    // add your #include statements here
#include <stdio.h>
}

//  Declare the two functions ShowChar
//  and GetChar with C linkage.
extern "C" {
    char ShowChar(char ch);
    char GetChar(void);
}

//  Define the two functions
//  ShowChar and GetChar with C linkage.
extern "C" char ShowChar(char ch) {
    putchar(ch);
    return ch;
}

extern "C" char GetChar(void) {
    char ch;
    ch = getchar();
    return ch;
}

// Declare a global variable, errno, with C linkage.
extern "C" int errno;

함수에 둘 이상의 링크 사양이 있는 경우 동의해야 합니다. 함수를 C 및 C++ 링크가 모두 있는 것으로 선언하는 것은 오류입니다. 또한 함수에 대한 두 개의 선언이 프로그램에서 발생하는 경우, 하나는 링크 사양이 있고 다른 선언은 없는 경우 링크 사양이 있는 선언이 먼저여야 합니다. 이미 링크 사양이 있는 함수의 모든 중복 선언에는 첫 번째 선언에서 지정된 링크가 제공됩니다. 예시:

extern "C" int CFunc1();
...
int CFunc1();            // Redeclaration is benign; C linkage is
                         //  retained.

int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
                         //  CFunc2;  cannot contain linkage
                         //  specifier.

Visual Studio 2019부터 지정된 경우 /permissive- 컴파일러는 함수 매개 변수 선언 extern "C" 도 일치하는지 검사. 로 선언된 extern "C"함수는 오버로드할 수 없습니다. Visual Studio 2019 버전 16.3부터 옵션 후 컴파일러 옵션을 사용하여 이 검사 재정의 /Zc:externC-/permissive- 할 수 있습니다.

참고 항목

키워드
번역 단위 및 링크
extern C의 스토리지 클래스 지정자
C에서 식별자의 동작
C의 링크