| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 구현
- 다이나믹프로그래밍
- dfs
- 컴퓨터비전
- BFS
- c++
- C
- lv2
- 컴퓨터 비전
- 우선순위큐
- 누적합
- Stack
- 다이나믹 프로그래밍
- cpp
- level3
- 임베디드
- 코틀린
- level2
- JavaScript
- 이분탐색
- 그리디
- 프로그래머스
- 백준
- kotlin
- 자바
- 통신 인터페이스
- dp
- 2018 KAKAO BLIND RECRUITMENT
- java
- 동적계획법
Archives
- Today
- Total
코드를 느껴바라
[C/C++] 정의와 선언의 차이 in C언어 본문
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 = “정의는 다른 파일에 있다” |
| 전역변수 정의는 반드시 한 번만 |
| 헤더에는 선언만 |
반응형
'개발 > 임베디드(Embedded)' 카테고리의 다른 글
| [소프트웨어 공학] Automotive-SPICE 개요 (A-SPICE) (2) | 2026.01.23 |
|---|---|
| [네트워크] CAN 통신 (2) | 2026.01.10 |
| [C/C++] C언어 자료형 (0) | 2025.12.24 |
| [C/C++] C에서 객체를 만드는 방법: 구조체와 생명주기 (0) | 2025.12.24 |
| [C/C++] C언어 프로젝트에서의 모듈화 (2) | 2025.12.23 |
