const와 typedef는 기본적으로 내부 링크로 처리되고 여기서 extern을 붙이면 외부 링크가 적용된다. 어떤 이름을 extern으로 지정하면 컴파일러는 이를 정의가 아닌 선언문으로 처리한다. 변수를 extern으로 지정하면 컴파일러는 그 변수에 대해 메모리를 할당하지 않는다 따라서 그 변수를 정의하는 문장을 따로 작성해야 한다.
/* AnotherFile.cpp */
extern int x;
int x{ 3 };
extern으로 선언하는 동시에 초기화가 가능하다.
/* AnotherFile.cpp */
extern int x = { 3 };
extern을 붙이지 않아도 x는 기본적으로 외부 링크로 처리되기 때문에 생략 해도 된다. extern이 반드시 필요한 경우는 다른 소스 파일에서 x에 접근하게 만들 때이다.
/* FirstFile.cpp */
#include <iostream>
extern int x;
int main()
{
std::cout << x << std::endl;
}
FirstFile.cpp에서 x를 extern으로 선언했기 때문에 다른 파일에 있던 x를 여기서 사용할 수 있는 것이다. main()에서 x를 사용하려면 컴파일러가 x의 선언문을 알아야 한다. x를 선언하는 문장에 extern을 붙이지 않으면 이 문장이 x를 선언하는 것이 아니라 정의한다고 판단해서 메모리를 할당해버림으로서 전역 스코프에 x라는 변수가 2개가 만들어지기 때문에 링크 단계에서 에러가 발생한다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ std::tuple 여러가지 타입들의 객체를 보관 / Structured binding (0) | 2022.10.12 |
---|---|
std::variant와 std::monostate 여러가지 타입 중 한 가지의 객체를 보관 (0) | 2022.10.10 |
C++ auto 타입 추론 (0) | 2022.09.21 |
C++ mutable (0) | 2022.09.15 |
C++ static (정적 변수 / 함수) (0) | 2022.09.13 |