linking, linkage
- 여기서 다루는 linkage는 obj 파일을 연결하는 linking과는 뉘앙스가 다름을 주의
- 지역변수를 사용할때는 linkage를 신경 쓸 필요가 없음.
Internal linkage
개별 cpp 파일 안에서만 적용되는 전역변수를 의미한다. 아래 코드에서 g_number 변수는 해당 cpp 파일 안에서만 유효하다.
int g_number = 12345;
int main()
{
doSometing();
}
g_number 변수 앞에 static을 붙이면 해당 전역변수를 해당 cpp 파일 내부에서만 유효하게 할 수 있다. 다른 c++ 파일에서는 접근할 수 없게된다.
static int g_number = 12345;
external linkage
전역 변수를 다른 파일에서도 사용하는 것을 의미한다.
아래 페이지에서 전방 선언을 통해 다른 cpp 파일의 함수를 사용하는 방법에 대해 썼다. (내용이 기억이 안날 경우 다시 한 번 복습)
https://byeongkyo.tistory.com/23
[C++] 함수
C++ 함수 작성시 주의사항 C++에서 함수 사용시 호출 이전에 선언(declaration)을 먼저 해야 한다.(전방 선언) 함수의 구현부는 definition이라고 부른다. 기초적인 부분이지만 C#, Java만 하다 몇 년만에 C+
byeongkyo.tistory.com
위 글에서는 생략된 내용이 있는데 사실은 Source.cpp 파일에서 test.cpp 파일의 함수를 전방 선언할때 extern 키워드가 생략되어 있다는 것이다. 전방 선언의 본래 형태에는 extern 키워드가 앞에 추가되어 있다.
extern void doSomething();
int main()
{
doSomething();
}
변수도 똑같이 extern 키워드를 붙이면 다른 cpp 파일에서도 사용 가능하다.
// int a 변수 초기화 cpp 파일
extern int a = 123;
// main 함수
using namespace std;
extern int a; // a 변수 전방 선언
int main()
{
cout << a << endl;
}
코드를 실행하면 정상적으로 a의 값이 출력된다.

단, 변수에 extern 키워드를 붙일 경우 반드시 해당 변수를 먼저 초기화해서 메모리를 확보해야 한다. 그렇지 않을 경우 링킹 에러가 발생한다.

주의해야 할 것은 한 번만 초기화해야 한다는 것이다. 중복 초기화 할 경우에도 링킹 에러가 발생한다.

전역 상수
(작성 중)
전역 상수를 선언할 때는 cpp파일에서 extern const을 사용해야 한다.
왜 cpp파일인가? 링킹 하는 obj 파일이 cpp파일을 컴파일해서 생성되는 것이기 때문이다. (따배씨 4.2 참고)
'C++ 학습' 카테고리의 다른 글
| [C++] 자료형 가명 (0) | 2023.11.12 |
|---|---|
| [C++] auto 키워드 (0) | 2023.10.21 |
| [C++] 정적 변수 (0) | 2023.10.03 |
| [C++] 스코프 (1) | 2023.10.03 |
| [C++] 연산자 (0) | 2023.10.01 |