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
헤더 파일에 선언된 extern
constexpr
변수가 포함된 경우 중복 선언이 결합되도록 표시 __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-
할 수 있습니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기