코드를 느껴바라

[C/C++] 정의와 선언의 차이 in C언어 본문

개발/임베디드(Embedded)

[C/C++] 정의와 선언의 차이 in C언어

feelTheCode 2025. 12. 30. 09:38

C 언어를 하다 보면 꼭 한 번은 만나게 되는 에러가 있다.

multiple definition of ...
undefined reference to ...

이 두 에러의 근본 원인은 전부
👉 선언(Declaration)과 정의(Definition)를 구분하지 못했기 때문이다.

이 글에서 이 둘의 차이와, extern이 왜 필요한지 정확히 정리한다.


선언과 정의의 차이

구분 의미 메모리 생성 여러 번 가능
선언 “이런 것이 있다”고 알려줌 ❌ 없음 ⭕ 가능
정의 실제 실체를 만들어 둠 ⭕ 있음 ❌ 1번만

👉 정의 = 메모리를 생성한다.
👉 선언 = 존재만 알린다.


변수에서의 선언과 정의

int a;        // 선언 + 정의
extern int b; // 선언만 (정의는 다른 파일에 있음)
코드 선언 정의
int a;
extern int b;

함수에서의 선언과 정의

int sum(int a, int b);   // 선언 (prototype)
int sum(int a, int b) { // 정의
    return a + b;
}

👉 함수는 몸통이 있으면 정의,
몸통이 없으면 선언이다.


+ 헤더(.h) 파일은 왜 선언만 있어야 할까?

헤더는 여러 파일에서 동시에 include 된다.
여기에 정의가 들어가면, 같은 변수가 여러 번 생성된다.

// bad.h (❌)
int x = 10;   // 정의 → 여러 파일에서 중복 생성 → 링크 에러 발생
// good.h (⭕)
extern int x; // 선언만
// x.c
int x = 10;   // 정의는 딱 한 번만

struct / enum / typedef는 왜 예외인가?

얘네는 메모리를 직접 만들지 않는다.
그래서 선언 자체가 정의 역할을 하며 중복되어도 문제 없다.

struct Person { int age; char name[10]; };
typedef int MYINT;
enum Color { RED, BLUE };

링커 에러의 정체

에러 메시지 의미
multiple definition 정의가 여러 개
undefined reference 선언만 있고 정의가 없음

👉 링커는 정의된 실체만 연결한다.


한 줄 요약

핵심
extern = “정의는 다른 파일에 있다”
전역변수 정의는 반드시 한 번만
헤더에는 선언만

반응형