답변:
전역 변수가있을 때 유용합니다. 헤더에 전역 변수 의 존재 를 선언하여 헤더를 포함하는 각 소스 파일에 대해 알 수 있지만 소스 파일 중 하나에서 한 번만 "정의"하면됩니다.
명확히하기 위해를 사용 extern int x;
하면 컴파일러에게 int
라는 유형의 객체 x
가 어딘가에 있다고 알립니다 . 존재하는 위치를 아는 것은 컴파일러 작업이 아니며, 유형과 이름 만 알고 있으면 사용 방법을 알 수 있습니다. 모든 소스 파일이 컴파일되면 링커는 x
컴파일 된 소스 파일 중 하나에서 찾은 하나의 정의에 대한 모든 참조를 분석 합니다. x
변수가 작동하려면 변수 정의에 "외부 링크"가 있어야합니다. 이는 기본적으로 함수 외부 (일반적으로 "파일 범위"라고 함) 외부에서 static
키워드 없이 선언해야 함을 의미합니다 .
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
몇 개의 모듈간에 변수를 공유 할 때 유용합니다. 한 모듈에서 정의하고 다른 모듈에서 extern을 사용하십시오.
예를 들면 다음과 같습니다.
file1.cpp에서 :
int global_int = 1;
file2.cpp에서 :
extern int global_int;
//in some function
cout << "global_int = " << global_int;
global_int
되어 있고 전역 네임 스페이스에있을 때 문제가 있습니까? 일부 네임 스페이스 섹션의 file2.cpp에서 사용하면 올바른 범위를 지정해야합니까? 즉namespace XYZ{ void foo(){ ::global_int++ } };
abc.h
로 정의 될 가능성이 높습니다 abc.cpp
. 좋은 IDE는 항상 도움이되지만, 잘 구성된 코드는 항상 더 나은 솔루션입니다.
extern
file2.cpp에 여전히에 액세스 할 수 있습니다 global_int
후 있습니다. 왜 내가 그것을해야합니까?
그것은 모두 연계 에 관한 것 입니다.
이전 답변은에 대한 좋은 설명을 제공했습니다 extern
.
그러나 중요한 점을 추가하고 싶습니다.
당신은에 대해 질문 extern
에서 C ++ 하지에 C 때 사건에 대해 언급 아무 대답이없는 이유를 모르겠어요 extern
함께 제공 const
++ C이다.
C ++에서 const
변수는 기본적으로 내부 링크가 있습니다 (C와 같지 않음).
따라서이 시나리오는 연결 오류가 발생합니다 .
출처 1 :
const int global = 255; //wrong way to make a definition of global const variable in C++
출처 2 :
extern const int global; //declaration
다음과 같아야합니다.
출처 1 :
extern const int global = 255; //a definition of global const variable in C++
출처 2 :
extern const int global; //declaration
extern
정의 없이 동일한 지 확인할 수 있습니까? global
소스 2 의 값을 인쇄하면됩니다 .
extern
생략한다 const int global = 255;
.
extern
여러 번 정의를 제공해야했습니다 . 다른 소스 파일의 테이블 만 정의 된 경우 Microsoft 도구에서 누락 된 기호에 대한 링크 오류가 발생했습니다. 문제는 테이블이었고const
C ++ 컴파일러static
가 번역 단위로 승격 시켰습니다 . 예를 들어ariatab.cpp
및을 참조하십시오kalynatab.cpp
.