logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

C++에서 extern의 역할, 기능

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

extern은 다른 파일에서 선언된 전역 변수에 대해 link를 시킵니다.

extern BOOL m_a 는 사용자에게 정확히 그 변수의 타입을 알려줄 수 있습니다.
extern m_a 는 사용자에게 정확히 그 변수의 타입을 알려줄 수는 없습니다.

변수타입의 명시는 user readability 정도의 의미가 아닐까 싶습니다.
그러므로 타입은 생략하기보다 명시하는게 좋겠죠.

컴파일시 컴파일러는 type checking 작업을 합니다. 이때 묵시적으로 사용된 값에 대해서는 그 타입을 추론합니다. 그러므로 타입이 명시 되지 않았더라도 적당한 타입을 추론하려 시도하게 됩니다. 이것은 타입 체킹 이전에 심볼테이블을 통해 검색될것 같군요. 만약 m_a라는 변수가 int, BOOL 두가지 타입으로 외부에 선언되었는데 extern 키워드에서 타입을 생략한다면 링크에러가 날 확률이 높습니다.

extern 키워드는 변수를 선언하는것이 아닙니다. 즉, 메모리를 잡지 않습니다.

c언어는 파일별로 컴파일을 따로 하고 링크하여 하나의 프로그램을 만들 수 있습니다. 이러한 특징이 낳은 키워드가 extern이라 볼 수 있습니다.

extern 키워드를 사용했다면 컴파일러는 그 변수가 선언되었다 가정하고 그 파일을 컴파일 합니다. 그러므로 컴파일 에러는 발생하지 않죠.

다만 링크작업시 해당 프로젝트에 있는 다른 obj들로 부터 extern에 명시한 변수를 찾아 링크해줍니다. (심볼테이블을 검색하여 링크해줍니다.)

정리하자면, extern 키워드를 사용 해서 변수를 명시했다고 메모리를 잡지는 않습니다. 그 메모리는 다른 파일에서 잡을것이고 단지 링커가 그 메모리를 찾아 링크합니다.


extern 변수의 단점

1. 코드에 대한 해석이 어려워질 수 있습니다. 몇 개 까지는 어렵지 않겠지만 전체 코드가 방대해지고 외부 변수를 남발하게 되면 소스의 분석이 너무 어렵게 됩니다.

    코드는 소스 파일별, 함수별로 독립되게 작성하는게 이해하기에 편합니다.

 

2. extern 변수를 사용하느 코드를 library로 작성한 경우입니다. 나중에 이 library를 사용하는 코드에서는 해당 extern 변수와 이름이 같은 변수를 사용할 경우 Linking시 오류가 발생합니다. 또한 여러 외부 Library를 linking할 경우 서로 extern 변수명이 같아서 애를 먹는 경우가 가끔 있습니다.

 

전역 변수 사용으로 문제를 쉽게 해결할 수도 있지만 남발하면 좋지 않겠죠.

단, standard library에 제공하는 extern 변수들이 있는데 사용해도 뭐라고 하지는 않겠죠.

TAG •

List of Articles
No. Subject Author Date Views
23 [Linux] Pthread 사용법, Thread 동기화 총정리 digipine 2017.11.01 294052
22 Unix C/C++ Input and Output Function Reference digipine 2017.11.01 88075
21 Solaris에서 pmap을 이용하여 백그라운드 프로세스 메모리 크기 구하기 digipine 2017.10.29 28598
20 Linux C 언어로 Shell 명령어 실행하기 digipine 2017.11.01 22587
19 C++ 컴파일 오류(error): variable 'std::istringstream sstream' has initializer but incomplete type digipine 2017.11.02 21077
18 wchar_t에 대하여 digipine 2017.11.01 7343
17 [shared lib] so 동적 라이브러리 만들기와 사용법 - 리눅스 digipine 2017.11.01 6434
16 STL MAP 예제로 공부하기 digipine 2017.10.29 5204
15 fopen 파일 열기 모드 옵션 정리 digipine 2017.11.02 3894
14 make -j 옵션으로 컴파일 속도 최적화 하기 digipine 2017.11.01 2759
» C++에서 extern의 역할, 기능 digipine 2017.10.29 2656
12 MD5 파일 변조 검사 관련 소스 (리눅스/Windows) digipine 2017.10.29 2613
11 Callback in C++ 와 Delegate 차이점 digipine 2017.11.01 2525
10 [C/C++] 현재시간 구하기 digipine 2017.10.28 2212
9 C++ Atomic 클래스에 대해서 file 엉뚱도마뱀 2017.12.13 2139
8 C 에서 Overloading 구현 digipine 2017.11.01 1790
7 brute-force 알고리즘을 이용한 패턴 위치 찾기 digipine 2017.10.29 1501
6 [linux] zlib build 방법 digipine 2017.11.01 1483
5 소켓 통신을 이용한 HTTP 서버 개발 강의록 file digipine 2020.08.01 1482
4 [C/C++] Random UUID String 생성 코드 digipine 2021.10.21 1302
Board Pagination Prev 1 2 Next
/ 2