编写好的 C 语言程序,想让它执行,需要经历 3 个步骤,分别是预处理、编译和链接,#include 指令就在预处理阶段(编译之前)执行。
#include 是 C语言预处理器(preprocessor)的指令,用于将其他文件的内容包含到当前源文件中。例如,C语言中最常见的#include
将其它文件包含到当前源文件中,本质上就是将其它文件的所有内容拷贝一份,然后插入到当前源文件中 #include 所在的位置(#include 被内容替换了)。
#include 包含的文件通常是头文件(扩展名为 .h),里面包含函数声明、宏定义、类型定义等内容,可以是标准库里的头文件,也可以是自定义的头文件。
#include的基本用法
#include 有两种主要形式,分别使用尖括号 <> 和双引号 " ":
#include <文件名> // 使用尖括号,适用于标准库文件
#include "文件名" // 使用双引号,适用于自定义文件
尖括号 <>:只在编译器指定的标准路径(如 /usr/include)中查找,适用于系统头文件。
双引号 " ":先在当前目录查找,如果找不到,再搜索标准路径,适用于用户自定义文件。
也就是说,<> 和 "" 在文件查找路径上有不同。例如,如果你在当前目录有一个 stdio.h,用 #include "stdio.h" 会优先包含它,而不是标准库的版本(不过这种做法不推荐,因为容易引发混淆)。
注意:#include 必须单独占一行,且以 # 开头,通常放在源文件顶部。
1) 包含标准库头文件
最常见的用法是包含 C语言标准库的头文件。例如,要使用输入输出函数,需要包含
#include
int main() {
printf("Hello, world!\n");
return 0;
}
运行结果为:
Hello, world!
在这里,#include
头文件
用途
输入输出函数,如 printf(),scanf()
内存管理、随机数等,如 malloc(),rand()
字符串操作,如 strlen(),strcpy()
数学函数,如 sqrt(),pow()
2) 包含自定义头文件
除了标准库,你还可以创建自己的头文件并用 #include 包含。例如,假设你有一个函数定义在单独的文件中:
//mymath.h
#ifndef MYMATH_H
#define MYMATH_H
int add(int a, int b);
#endif
//mymath.c
#include "mymath.h"
int add(int a, int b) {
return a + b;
}
//main.c
#include
#include "mymath.h"
int main() {
int sum = add(3, 5);
printf("3 + 5 = %d\n", sum);
return 0;
}
输出结果:
3 + 5 = 8
在这个例子中,#include "mymath.h" 将 mymath.h 的内容引入 main.c,提供了 add() 函数的声明。注意,mymath.h 使用了条件编译(#ifndef 和 #define),防止头文件被重复包含。
嵌套包含#include
头文件中也可以使用 #include,称为嵌套包含。例如:
//header1.h
#ifndef HEADER1_H
#define HEADER1_H
#include
void printMessage() {
printf("From header1\n");
}
#endif
//main.c
#include "header1.h"
int main() {
printMessage();
return 0;
}
输出结果:
From header1
这里,header1.h 包含了
防止重复包含
如果一个头文件被多次包含,可能导致重复定义错误。C语言通过条件编译解决这个问题,常用以下模式:
#ifndef 头文件名_宏
#define 头文件名_宏
// 头文件内容
#endif
例如上面的 mymath.h,#ifndef MYMATH_H 检查是否已定义 MYMATH_H,如果没有,则定义并包含内容;如果已定义,则跳过,避免重复。
#include包含其他源文件(不推荐)
理论上讲,#include 可以包含任何文本文件(包括 .c 文件),但不推荐直接包含源文件。例如:
//func.c
int add(int a, int b) {
return a + b;
}
//main.c
#include
#include "func.c" // 不推荐
int main() {
printf("Sum = %d\n", add(2, 3));
return 0;
}
这种做法会导致 func.c 的实现直接包含到 main.c,破坏模块化,且可能引发链接错误(如函数重复定义)。
#include使用注意事项
使用 #include 时需注意以下问题:
问题
说明
路径错误
文件不存在或路径不对会导致编译错误,确保文件位置正确。
重复包含
未使用条件编译可能导致重复定义,使用 #ifndef 防护。
不必要的包含
包含未使用的头文件会增加编译时间,尽量精简。
大小写敏感
文件名在某些系统(如 Linux)上区分大小写,需保持一致。