头文件通过预处理器标识符(include)而成为我们程序的一部分。预处理器标识符用“#”来标识。这个符号放在程序的最开始 的第一行的位置上。处理这些标识符的程序称为预处理器(preprocessor),一般绑定在编译器中。
include 指示符读入指定文件的内容,它有两种格式:
#include<iostream>
#include"iostream"
如果文件名用"<"和 ">"括起来。那么表示这个文件是一个工程文件或者标准的头文件。查找过程会检查预定义的目录。我们可以通过设置搜索路径环境变量或者命令行选项来修改这些目录。
如果文件是用引号括起来的,就表示这个文件是用户自己提供的,那么查找这个文件的时候,就可以从当前的目录开始查找,
被包含的文件可能还会包含#include,一个同文件可能会被同一个原文件多次的包含。条件指示符可以防止这种头文件被重复包含的情况。
例如:
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/*bookstore.h的内容*/
#endif
条件指示符#ifndef用于检查预编译器常量BOOKSTORE_H是否已经被定义了(习惯上我们把与编译器常量用大写表示)。如果BOOKSTORE_H没有在前面定义的话,那么#ifndef 的值为真。那么#ifndef 和#endif中间的语句
将会被执行,否则的话,之间的语句就会被忽略。
为了保证头文件只被处理一次。把如下的的头文件放在#ifndef的后面。
#define指示符放在#ifndef的后面。这样头文件在第一次包含的时候,BOOOKSTORE_H就被定义了,那么以后如果在出现包含头文件的情况,则 #ifndef的值就为假了。
只要不存在“两个必须包含的头文件使用同一个预编译器常量”这种情况,那么这种机制就会很好的运行。
#ifdef指示符用来判断一个预定义器常量是否已经被定义了,以便有条件的包含程序代码。
注意:
#ifndef条件指示符和ifdef指示符的区别。
前者用于防止头文件被重复包含,而后者则是为了判断一下一个预定义器常量是否被定义了。
我们在编译程序的时候,可以使用-D,在——D的后面写上预处理器常量的名字,这样就可以在命令行中定义一个与处理器的常量了。
$CC -DBOOKSTORE_H main.c
也可以用#define指示符来定义一个预处理器的常量。