“Think in C ++”을 읽고 extern
선언을 도입했습니다 . 예를 들면 다음과 같습니다.
extern int x;
extern float y;
나는 의미 (정의없는 선언)를 이해한다고 생각하지만 그것이 언제 유용한 지 궁금합니다.
누군가가 모범을 보일 수 있습니까?
답변
전역 변수가있을 때 유용합니다. 헤더에 전역 변수 의 존재 를 선언하여 헤더를 포함하는 각 소스 파일에 대해 알 수 있지만 소스 파일 중 하나에서 한 번만 “정의”하면됩니다.
명확히하기 위해를 사용 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
소스 1 :
#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();
}
소스 2 :
#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;
답변
그것은 모두 연계 에 관한 것 입니다.
이전 답변은에 대한 좋은 설명을 제공했습니다 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을 선언합니다.