시작은 미미하나 끝은 쥬쥬하리라.

Develop/Language - C++

[C++] extern과 using

코딩뚜벅이 2026. 1. 22. 16:46
반응형

목차

1. extern, using

2. 응용/심화

3. 요약

 


1. extern, using

extern :

메모리 할당은 한 곳에서만 할테니 다른 곳에서는 이름만 빌려서 사용하라고 링커에게 보내는 일종의 약속.

ex) 전역 변수를 헤더 파일에 직접 선언하고 초기화하는 경우, 해당 헤더를 포함하는 모든 cpp에서 해당 변수가 생성되어 중복 정의 에러 발생.

-> extern을 사용하여 변수 혹은 함수를 선언하는 경우 정확히 1개의 cpp에서 정의하겠다는 의미.

-> 설정값, 공통 핸들 등 시스템 전역에서 공유해야하는 자원을 안전하게 노출하는 경우 사용.

 

ex) 사용 예시

// CommonConfig.h (헤더)
#ifndef COMMON_CONFIG_H
#define COMMON_CONFIG_H

#ifdef __cplusplus
extern "C" { // C++ 환경에서도 C 커넥션 유지 (Name Mangling 방지)
#endif

    extern int g_SystemStatus; // 선언만 존재 (메모리 할당 X)
    void Internal_C_Function();

#ifdef __cplusplus
}
#endif

#endif

// CommonConfig.cpp (구현)
#include "CommonConfig.h"

int g_SystemStatus = 0; // 실제 메모리 할당 및 초기화 (단 한 곳에서만!)

// 주석: 헤더에 extern을 두고 cpp에서 실제 정의를 하는 것이 
// 링크 에러를 막는 가장 기본적이고 강력한 규칙입니다.

 

extern 사용 목적

 

using :

복잡한 네임스페이스 계층을 다루는 도구이며 사용 시 특정 네임스페이스를 해당 스코프로 가져오는 기능.

ex) using namespace std;

-> std 클래스 전체를 해당 스코프로 가져오며 cout을 std::cout이 아닌 cout만으로 사용.

ex) using std::string;

-> std 클래스 중 string만 가져오며 모호성을 줄이고 가독성을 높이는 권장 방식.

 

- using namespace 등의 선언을 헤더 파일에 하게되면 해당 헤더와 연결된 다른 소스까지 오염되는 상황이 발생하기 때문에 cpp 내부 스코프에서만 사용하도록 주의.

 

using 선언 사용 방식

 


2. 응용/심화

맹글링(Mangling)

컴파일러가 함수 오버로딩의 구분을 위해 기존의 이름을 변형하는 동작.

-> C언어 : Print(a)를 컴파일하면 Print라는 이름으로 메모리에 등록.

-> C++ : Print(a)와 Print(b)의 오버로딩을 허용하기 때문에 둘의 구분을 위해 Print가 아닌 다른 이름으로 변형하여 메모리에 등록.

 

extern "C"

C언어로 만든 외부 SDK의 특정 함수를 사용하고 싶은 경우 C++ 컴파일러는 맹글링되어 변형된 이름의 함수를 찾지만 C 라이브러리 내부에는 원형의 함수 이름만 존재하여 Link Error 발생.

 

extern "C"의 의미 : C++의 방식(맹글링)이 아닌 C방식으로 해당 함수를 찾으라는 의미로 사용.

원리 : C 라이브러리의 특정 함수는 이미 메모리 어딘가에 있기 때문에 C++코드에서는 extern "C"를 통해 해당 함수의 선언만 하고, 컴파일 과정에서 맹글릭 과정 없이 선언된 함수의 이름으로 C 라이브러리 함수를 링크.

 


3. 요약

extern : 메모리 할당 및 정의는 별도의 스코프에서 할테니 선언으로만 사용하겠다는 의미의 키워드.

-> 상태 값 등의 전역 변수 혹은 C 라이브러리 함수 호출 등에 사용.

-> extern은 헤더에서, 정의는 하나의 cpp에서.

using : 네임스페이스를 특정 스코프로 가져오는 기능.

-> 네임스페이스 충돌 혹은 컴파일 에러 방지를 위하여 헤더 파일에는 using namespae 금지.

 

- C 라이브러리 호출에는 반드시 extern "C" 포함.

반응형

'Develop > Language - C++' 카테고리의 다른 글

[ C++] 오버로딩 vs 오버라이딩  (0) 2026.01.22
[C++] typedef  (0) 2026.01.22
[C++] 전방선언(Foward declaration)  (0) 2026.01.22
[C++] #include < >vs #include " "  (0) 2026.01.22
[C++] C, C++, C#의 차이점  (0) 2026.01.22