Linkage
링크
- 서로 다른 File(Translation Unit)들이 같은 이름(변수나 함수와 같은)을 공유하는 것을 의미한다.
- 공유하는 영역에 따라 External Linkage(외부 링크), Internal Linkage(내부 링크)로 나뉜다.
* Linkage에 따른 변수 인식 우선순위
지역 변수 > Internal Linkage > External Linkage
Language Linking (언어 링크)
- 링커는 기본적으로 구별되는 각 함수마다 서로 다른 기호 이름을 요구한다.
* C Language Linking (C언어 링크)
- C 함수의 이름이 중복되는 것을 불허하기 때문에 하나의 함수에 하나의 이름만 부여된다.
- 위와 같은 이유로, C에서는 비교적 함수 기호 이름 부여를 수월하게 처리할 수 있다.
(가령, 함수이름 앞에 Under Bar기호만 붙여서 기호 이름을 만드는 등 단순하게 만들어도 중복될 위험이 전혀 없다.)
* C++ Language Linking (C++언어 링크)
- C언어와 달리, C++에서는 함수 이름이 오버로딩 기능으로 인해 중복될 수 있으므로, 각기 다른 함수가 같은 이름을 가질 가능성이 있다.
- 위와 같은 이유로, C++에서는 함수마다 기호 이름을 부여하는 방식이 C언어 만큼 단순할 수는 없으며, 이 때문에 Name Mangling(Name Decoration; 이름 장식) 기법이 고안되었다.
Ex. C++에서의 Name Mangling 수행 예시
spiff(int) -> _spiff_i(int)
spiff(double, double) -> _spiff_d_d(double, double)
Language Linking Protocol (언어 링크 프로토콜)
- C와 C++에서의 이름 장식 기법이 다르기 때문에 같은 함수라도 기호 이름이 다르게 부여되고, 이로 인해 C++프로그램에서 미리 컴파일된 C 라이브러리의 함수를 사용하고 싶을 경우 코드가 C의 라이브러리가 아닌, C++의 함수를 먼저 찾게 되고, C++로 정의된 같은 이름의 함수가 있다면 그 함수를 연결하게 되는 문제가 있다.
- 위와 같은 이유에서, 미리 정의된 함수를 링크할 때, 이름 장식 기법을 C언어로 할지, C++로 할지의 프로토콜을 명시적으로 선택시키는 방법이 있다.
- 명시하지 않을 경우, 기본적으로 C++ 방식을 사용하게 된다.
Ex. 언어 링크 프로토콜 선언 예시
extern "C" void Func(int); // C 타입의 이름 장식 프로토콜을 사용하여 함수를 찾는다.
extere "C++" void Func(int); // C++ 타입의 이름 장식 프로토콜을 사용하여 함수를 찾는다.
extern void Func(int); // 명시하지 않을 경우, C++ 타입의 이름 장식 프로토콜을 사용한다.