이전 글에서 static 변수는 외부 접근을 막는 용도로 사용된다고 설명했다.
그렇다면 반대로, 여러 파일에서 하나의 변수를 공유하려면 어떻게 해야 할까?
이때 사용하는 것이 'extern' 키워드다.
특히 실무에서는 extern 선언을 .h 파일에 두는 것이 일반적이다.
이번 글에서는 extern 변수의 정확한 사용법과 헤더 파일로 관리하는 이유까지 정리한다.
extern 이란?
extern은 다른 파일에 정의된 변수를 가져와서 사용하는 키워드다.
즉, 변수를 '선언'만 하고 실제 메모리는 다른 곳에 존재한다.
* extern = 선언
* 실제 변수는 다른 파일에 존재 (정의)
### globals.h (extern 선언)
#ifndef GLOBALS_H
#define GLOBALS_H
extern int g_value;
#endif
### globals.c (변수 정의)
#include "globals.h"
int g_value = 10;
### main.c (사용)
#include "globals.h"
void func(void)
{
g_value++;
}
변수는 globals.c에서 단 한 번만 정의한다.
다른 파일들은 globals.h를 include 해서 사용해야 한다.
그러면, 모든 파일이 하나의 변수(g_value)를 공유하게 된다.
왜 extern을 헤더(.h) 파일에 선언하는가?
1. 선언 중복 방지
extern을 각 .c 파일에 직접 쓰게 되면, 파일마다 반복 작성하게 되어 선언 누락 가능성도 있고,
유지보수의 어려움이 생길 수 있다.
따라서, 헤더(.h) 파일에 한 번만 선언하고, 필요한 곳에서 include 하는 방식으로 사용해야 한다.
2. 선언 일관성 유지
extern int g_value; → extern uint32_t g_value;
위 처럼 int 에서 uint32 로 변수 타입 변경 시 헤더 파일 하나만 수정하면 전체 반영된다.
3. 구조적인 코드 관리
실무에서는 보통 이렇게 분리한다:
* globals.c → 실제 데이터
* globals.h → 인터페이스 (외부 공개)
즉, extern은 “인터페이스 역할”을 한다.
extern 사용 시 반드시 지켜야 할 규칙
규칙 1: 변수는 한 번만 정의
int g_value = 10; // 단 하나만 존재해야 함
여러 곳에 있으면 multiple definition error 가 발생한다.
규칙 2: 나머지는 extern 선언만
extern int g_value;
선언은 여러 번 가능 (문제 없음)
규칙 3: 선언과 정의 타입 일치
extern int g_value; // 선언
int g_value = 10; // 정의
타입이 다르면 undefined behavior or linker error 가 발생한다.
실무 예제
/* sensor.h */
#ifndef SENSOR_H
#define SENSOR_H
extern uint8 sensor_value;
#endif
/* sensor.c */
#include "sensor.h"
uint8 sensor_value = 0U;
/* control.c */
#include "sensor.h"
void Control(void)
{
if (sensor_value > 100U)
{
// 제어 로직
}
}
센서 값은 sensor.c 파일에서 정의되고 관리된다.
control.c 파일을 포함한 다른 파일에서는 extern을 통해 해당 값을 공유해서 사용한다.
정리
extern은 다른 파일의 변수를 사용하기 위한 선언 키워드이다.
실무에서는 헤더(.h)에 선언하는 것이 기본이다.
변수는 한 번만 정의하고, 나머지는 extern으로 참조한다.
잘못 사용하면 링크 에러가 발생할 수 있다.
결론적으로 extern은 헤더 파일을 통해 공유하는 전역 변수 인터페이스다.
'C 언어 > 실무' 카테고리의 다른 글
| C언어 구조체 실무 예제 (왜 구조체를 쓰는가?) (0) | 2026.04.15 |
|---|---|
| C언어 비트 연산자 쉽게 설명하기 (임베디드 실무 관점에서 제대로 이해하기) (0) | 2026.04.14 |
| C언어 배열과 포인터 차이 (헷갈리는 이유부터 핵심 차이까지) (0) | 2026.04.12 |
| C언어 포인터 쉽게 설명하기 (개념부터 실무 예제까지 한 번에) (4) | 2026.04.11 |
| C언어 volatile은 언제 써야 하는가? (0) | 2026.04.11 |