Z
ZHANK
编程在线教程C 语言教程头文件与多文件编译
文件与预处理

头文件与多文件编译

头文件守卫 #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 只重编译改动的文件——省下大量编译时间。