头文件与多文件编译
头文件守卫 #ifndef、模块化编程、Makefile 入门
头文件与多文件编译
小程序一个 .c 文件就够了。但真实项目需要把代码拆成多个文件,用头文件做接口。
学完本章你将: 掌握头文件守卫、模块化组织、Makefile 入门。
为什么需要头文件
c
// math_utils.h —— 头文件(接口声明)
#ifndef MATH_UTILS_H // 头文件守卫
#define MATH_UTILS_H
int add(int a, int b); // 声明
int multiply(int a, int b);
#endif
c
// math_utils.c —— 源文件(实现)
#include "math_utils.h"
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
c
// main.c
#include <stdio.h>
#include "math_utils.h" // 引入自己的头文件
int main() {
printf("%d\n", add(3, 4)); // 7
printf("%d\n", multiply(3, 4)); // 12
return 0;
}
头文件守卫 —— 防重复包含
c
#ifndef MY_HEADER_H
#define MY_HEADER_H
// ... 头文件内容 ...
#endif
⚠️ 没有守卫可能导致同一个头文件被 include 两次,造成重复定义编译错误。
编译多文件
bash
# 分开编译再链接
gcc -c main.c # → main.o
gcc -c math_utils.c # → math_utils.o
gcc main.o math_utils.o -o program
# 或一步到位
gcc main.c math_utils.c -o program
Makefile 入门
makefile
# Makefile
program: main.o math_utils.o
gcc main.o math_utils.o -o program
main.o: main.c math_utils.h
gcc -c main.c
math_utils.o: math_utils.c math_utils.h
gcc -c math_utils.c
clean:
rm -f *.o program
💡 Makefile 只重编译改动的文件——省下大量编译时间。