링커, 로더, 실행 파일
a.c와 b.c 양쪽에서 static을 붙이지 않은 같은 이름의 전역 함수 void init(void)를 정의하고 링크했다. 일어나는 일로 올바른 것은?
- A나중에 링크한 쪽이 자동으로 사용되며 오류는 나지 않는다
- B같은 심볼이 두 번 정의되었다며 링크할 때 오류가 난다
- C두 함수가 자동으로 하나로 합쳐져 두 처리가 차례로 실행된다
정답과 해설 보기
정답: B. 같은 심볼이 두 번 정의되었다며 링크할 때 오류가 난다
static을 붙이지 않은 전역 함수는 프로그램 전체에서 하나의 이름을 공유합니다. 같은 이름의 정의가 둘이면 링커는 참조를 어느 쪽에 연결해야 할지 정할 수 없으므로 다중 정의(multiple definition) 오류가 됩니다. 파일 안에서만 쓰는 함수라면 static을 붙여 외부에서 보이지 않게 하면, 다른 파일에 같은 이름이 있어도 충돌하지 않습니다.
- A. 일반적인(강한) 심볼에서는 어느 한쪽을 선택하지 않습니다.
- B. 올바릅니다. 다중 정의 오류입니다.
- C. 함수가 합쳐지는 일은 없습니다.