extern, static은 linkage와 연관되어있는데
extern은 바깥쪽에서 link를 찾아라
static은 안쪽에서 link를 열어라
//c++에서는 build proccess에서 사용되는 static외에
//static memory를 사용하라는 키워드가 있다.
위와 같이 main.cpp와 foo.cpp를 만들고
g++ main.cpp foo.cpp
로 빌드하게 되면
에러가 나오게되는데 a가 두번 선언되어 컴파일은 되지만 link가 안된다는 뜻이다.
위와 같이 main.cpp의 변수a에 extern을 붙이게 되면
a의 정의는 main.cpp파일 바깥쪽 어딘가에 있다고 알려준다.
그래서 foo.cpp의 a의 정의인 a=100을 가지고 와서 사용하게 된다.
static을 사용할 경우 변수를 바깥에서 찾을 수 없게 만든다.
따라서 main.cpp의 a는 foo.cpp의 a를 무시하게된다.
함수의 declaration의 경우에는 자동으로 extern인 것과 같이 동작한다.
변수가 하나의 object파일이나 translation unit바깥으로 link를 주지않는다는 확신이 있으면
static을 붙여 더 안전한 build환경을 가져갈 수 있다.
오른쪽 cat.cpp에서 speak()함수를 보면 bye()함수를 호출하는데
bye()함수를 보면 class의 어떤 멤버변수에도 접근하지 않고 있다.
따라서
처럼 함수가 직접적으로 object와 관련이 없다고 생각되면 static을 붙여준 free function으로 만들어주는 것이 일반적으로 맞는 방법이다.
name mangling
static_cast를 이용하여
(위가 main.cpp 아래가 foo.cpp)
을 nm foo.o
로 실행해보면 foo.o파일의 symbol들을 볼 수 있다.
main.cpp에 있는 foo, bar 함수가 object파일로 바뀌면서 Z3food, Z3bari로 바뀌는데
이는 c++의 name mangling이라는 compile proccess때문인데,
이를 해주는 이유는 function overloading때문이다(이름은 같지만 인수의 타입이 다른 경우 다르게 동작하는 것)
보다시피 같은함수를 인수 타입마다 다르게 표시해준다.
C++코드에서 function overloading기능이 없는 순수한 C를 위한 binary를 제공하기 위해 name mangling 기능을 빼주는 extern "C"를 사용한다.