头文件是扩展名为.h的文件,其中包含C函数的声明和宏定义,也可以多个源文件之间共享。有两种类型的头文件:程序员编写的文件,和编译器中附带的文件。
要求使用头文件的程序,包括通过它,使用C语言预处理指令#include就像所看到的包含stdio.h头文件,它随着编译器自带。
包括一个头文件等于复制头文件的内容,但我们不这样做,因为这很容易出错,一个好主意是我们不复制头文件的内容,特别是包括多个程序的源文件。
在C或C++程序的简单做法是,我们把所有的常量,宏全系统全局变量和函数原型在头文件,其中包括只要它要求包含头文件。
包括/函语法
用户和系统头文件使用预处理指令#include包括在内。它有以下两种形式:
#include <file>
这种形式被用于系统头文件。它会搜索系统目录的标准列表中指定的文件的文件。可以在前面加上目录到这个列表-I选项在编译源代码。
#include "file"
这种形式是用于自己的程序的头文件。它会搜索包含当前文件的目录中的文件命名的文件。可以在前面加上目录到这个列表-I选项在编译源代码。
包括/函操作
#include指令的工作原理是指导C预处理器使用当前的源文件的其余部分,然后再继续扫描指定的文件作为输入。从预处理器的输出包含后跟来自于#include指令后的文本的输出已生成输出,随后从所包含的文件所得的输出。例如,如果有一个头文件 header.h 如下:
char *test (void);
主程序调用使用头文件,类似 program.c 这样:
int x; #include "header.h" int main (void) { puts (test ()); }
编译器会看到同样数据流,因为它会如果program.c读取
int x; char *test (void); int main (void) { puts (test ()); }
一次性头文件
如果头文件恰好被包含两次,编译器将处理它的内容两次,将导致一个错误。使用标准方法以防止包围文件的全部内容在一个条件,是这样的:
#ifndef HEADER_FILE #define HEADER_FILE the entire header file file #endif
此构建体通常被称为包装#ifndef。当该头被再次包含,条件将是假的,因为HEADER_FILE定义。预处理器将跳过该文件的全部内容,而编译器不会看到它的两次。
计算包函
有时,有必要选择的几个不同的一个头文件被包含到程序中。它们可能会指定的配置参数被用于对不同类型的操作系统,例如。可以用一系列条件句做到这一点,如下所示:
#if SYSTEM_1 # include "system_1.h" #elif SYSTEM_2 # include "system_2.h" #elif SYSTEM_3 ... #endif
但是,随着它的内容增长就会变得单调乏味,代替预处理器提供了使用宏的头文件名。这就是所谓的计算包括。而不是写一个头文件名#include直接参数,只需把宏的名字代替:
#define SYSTEM_H "system_1.h" ... #include SYSTEM_H
SYSTEM_H将被扩展,而预处理器将寻找system_1.h仿佛的#include已经写了原来的方式。 SYSTEM_H可以通过Makefile -D选项定义。