null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
.h 파일과 .c 파일 역할 구분
#c
#header
#source
#module
#embedded
@devpc
|
2026-05-04 12:40:01
|
GET /api/v1/nodes/452?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# .h 파일과 .c 파일 역할 구분 ## 왜 나누는가 C 소스 파일이 하나일 때는 나눌 이유가 없다. 파일이 여럿이 되면 "어떤 함수가 어디 있는가"를 서로에게 알려야 한다. `.h`(헤더)가 그 역할을 한다. --- ## 헤더 파일의 역할 헤더 파일은 **선언(declaration)** 만 담는다. 구현은 `.c` 파일에 있다. ```c /* sensor.h — 선언만 */ #ifndef SENSOR_H #define SENSOR_H #include <stdint.h> typedef struct { uint8_t id; float value; } SensorData; /* 함수 선언 (프로토타입) */ int sensor_init(uint8_t id); int sensor_read(uint8_t id, SensorData *out); void sensor_reset(void); #endif /* SENSOR_H */ ``` --- ## 소스 파일의 역할 ```c /* sensor.c — 구현 */ #include "sensor.h" #include <string.h> static SensorData sensors[8]; /* 외부에서 접근 불가 */ int sensor_init(uint8_t id) { if (id >= 8) return -1; sensors[id].id = id; sensors[id].value = 0.0f; return 0; } int sensor_read(uint8_t id, SensorData *out) { if (id >= 8 || !out) return -1; *out = sensors[id]; return 0; } void sensor_reset(void) { memset(sensors, 0, sizeof(sensors)); } ``` `static SensorData sensors[8]`는 이 `.c` 파일 안에서만 보인다. 내부 상태를 숨기는 C 언어식 캡슐화다. --- ## Include Guard 헤더가 여러 번 `#include`되면 타입·매크로 재정의 에러가 난다. 이를 막는 것이 Include Guard다. ```c /* 방법 1: ifndef guard (전통적) */ #ifndef MY_MODULE_H #define MY_MODULE_H /* ... 내용 ... */ #endif /* 방법 2: #pragma once (현대적, 대부분 컴파일러 지원) */ #pragma once /* ... 내용 ... */ ``` `#pragma once`가 더 간결하지만 MISRA C 프로젝트 등 엄격한 환경에서는 `ifndef` guard를 요구하기도 한다. --- ## extern: 다른 파일의 변수 선언 ```c /* config.c */ int g_baud_rate = 115200; /* config.h */ extern int g_baud_rate; /* 다른 파일에 정의됨을 선언 */ /* main.c */ #include "config.h" printf("Baud: %d\n", g_baud_rate); ``` 전역 변수를 여러 파일에서 공유할 때 `extern`으로 선언한다. 단, 전역 변수 공유는 최소화하는 것이 좋다. --- ## 파일 구성 예시 ``` project/ src/ main.c sensor.c uart.c include/ sensor.h uart.h ``` 헤더를 별도 `include/` 폴더에 두는 방식이 일반적이다. MCU 프로젝트(STM32, Aurix)에서도 동일한 구조를 따른다.
// COMMENTS
Newest First
ON THIS PAGE