본문 바로가기

Cpp

외부링크 내부링크

static과 extern 키워드를 이용한 내부/외부 링크

변수는 스코프(scope)와 주기(duration) 외에도 링크(linkage)라는 세 번째 속성이 있다. 링크는 같은 이름의 여러 식별자가 같은 식별자를 참조하는지를 결정한다.

 

 

링크가 없는 변수는 정의된 제한된 범위에서만 참조할 수 있다. 지역 변수가 링크가 없는 변수의 예이다. 이름은 같지만 다른 함수에서 정의된 지역 변수는 링크가 없다. 

내부 링크가 있는 변수를 static 변수라고 한다. static 변수는 변수가 정의된 소스 파일 내에서 어디서나 접근할 수 있지만, 소스 파일 외부에서는 참조할 수 없다.

외부 링크가 있는 변수를 extern 변수라고 한다. extern 변수는 정의된 소스 파일과 다른 소스 파일 모두에서 접근할 수 있다.

기본적으로 비-상수(not const) 전역 변수는 외부 링크 속성을 가지고 있다. 원하는 경우 static 키워드를 통해 명시적으로 내부 링크 속성을 가지게 할 수 있다.

반대로 상수(const) 전역 변수는 내부 외부 링크 속성을 기본으로 가진다. 원하는 경우 extern 키워드를 통해 외부 링크 속성으로 만들 수 있다.

 

extern 키워드를 통한 변수 전방 선언

다른 소스 파일에서 선언된 외부 전역 변수를 사용하려면 '변수 전방 선언(variable forward declarations)'을 해야 한다.

extern 키워드는 두 가지 다른 의미가 있다. 어떤 상황에서는 extern 키워드가 '외부 링크가 있는 변수를 의미' 하고 다른 상황에서는 '다른 어딘가에서 정의된 변수에 대한 전방 선언'을 의미한다.

 

만약 변수 전방 선언이 함수 외부에서 선언되면 소스 파일 전체에 적용된다. 함수 내에서 선언되면 해당 블록 내에서만 적용된다.

변수가 static으로 선언된 경우, 이에 접근하기 위해 변수 전방 선언을 해도 적용되지 않는다

 

함수 링크

함수는 변수와 같은 링크 속성을 가진다. 함수는 항상 외부 링크로 기본 설정되지만 static 키워드를 통해 내부 링크로 설정할 수 있다.

함수 전방 선언에는 extern 키워드가 필요하지 않다. 컴파일러는 함수 몸체인지 함수 원형인지 알아서 판단한다.

 

'Cpp' 카테고리의 다른 글

인터페이스  (0) 2023.02.27
추상클래스  (0) 2023.02.27
변수주기  (0) 2023.02.23
Static  (0) 2023.02.23
스택 프레임(stack frame)  (0) 2023.02.23