선언, 정의, 연결성
1. 번역단위 살펴보기
컴파일러는 한번에 한개의 번역 단위만 처리하기 때문에 외부의 전역 변수나 함수를 처리할 때면 그냥 이런 외부참조들이 있을 것이라고 가정하고 진행할 수 밖에 없다.
이 결과 나온 목적파일들을 링커가 미확정 상태인 참조가 진짜 어떤 것인지 알아내려고 시도하고 이 과정이 성공하면 모든 함수와 전역변수, 정적변수, 번역 단위 간 참조가 전부 포함된 실행 파일이 만들어진다.
2. 선언과 정의의 차이
C/C++ 에서느 변수나 함수를 사용하기 전에 반드시 선언되고, 정의 돼야 한다.
* 선언 데이터 객체나 함수의 형태를 나타낸다.
- 컴파일러에 '이름'과 데이터 타입 혹은 함수의 서명을 알려 준다.
* 정의 프로그램 안에 고유한 저장 공간을 나타낸다. 이 저장 공간 안에는 변수, 구조체 및 클래스의 인스턴스, 함수의 기계어 등이 들어갈 수 있다.
3. 선언과 정의의 중복
선언은 여러번 할 수 있지만 정의는 한번 밖에 할 수 없다.
한 번역 단위 안에서 같은 정의가 여러번 나오면 컴파일러가 에러를 낸다.
똑같은 정의가 서로 다른 번역 단위에 있다면 컴파일러는 알아채지 못한다.
이때는 링커가 중복된 심볼 에러를 낸다.
4. 연결성
외부 연결성은 다른 번역 단위에서도 볼수 있고 사용할 수 있다.
내부 연결성은 정의가 위치한 번역 단위에서만 볼 수 있기때문에 그 번역 단위에서만 쓸 수 있다.
기본적으로 모든 정의 는 외부 연결성 이며, static키워드는 정의를 내부 연결성으로 부꿀 때 사용한다. .cpp마다 똑같은 정의가 있더라도 static이 붙어있으면 링커는 이것을 서로 다른 존재라호 인식한다.
인라인 함수는 기본적으로 내부 연결성이다.