C语言 头文件

  • 头文件

    头文件是扩展名为.h的文件,其中包含C函数声明和宏定义,这些声明将在多个源文件之间共享。头文件有两种类型:程序员编写的文件和编译器随附的文件。您可以通过C预处理指令#include将其包含在请求在程序中使用头文件的源文件中,就像您看到包含stdio.h头文件一样,该文件随编译器一起提供。包含头文件等同于复制头文件的内容,但是我们不这样做,因为它容易出错,并且在源文件中复制头文件的内容也不是一个好主意,尤其是当我们一个程序中有多个源文件。在C或C ++程序中的一个简单实践是,我们将所有常量,宏,系统范围的全局变量和函数原型保留在头文件中,并在需要的地方包括该头文件。
  • 包含语法

    使用预处理指令#include包括用户和系统头文件。它具有以下两种形式-
    
    #include <file>
    
    该格式用于系统头文件。它在系统目录的标准列表中搜索名为“file”的文件。您可以在编译源代码时使用-I选项在此格式之前添加目录。
    
    #include "file"
    
    该格式用于您自己程序的头文件。它在包含当前文件的目录中搜索名为“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。当再次包含标头时,条件将为false,因为已定义HEADER_FILE。预处理器将跳过文件的全部内容,而编译器将不会两次看到它。
  • 计算包含

    有时有必要选择要包含在程序中的几个不同的头文件之一。例如,他们可能会指定要在不同种类的操作系统上使用的配置参数。您可以使用一系列条件来做到这一点-
    
    #if SYSTEM_1
       # include "system_1.h"
    #elif SYSTEM_2
       # include "system_2.h"
    #elif SYSTEM_3
       ...
    #endif
    
    但是随着它的增长,它变得乏味,相反,预处理器提供了使用宏作为标头名称的功能。这称为计算的include。无需将标头名称写为#include的直接参数,只需将宏名称放在其中-
    
    #define SYSTEM_H "system_1.h"
    ...
    #include SYSTEM_H
    
    SYSTEM_H将被扩展,预处理器将查找system_1.h,就像#include最初是用这种方式编写的一样。您的Makefile可以使用-D选项定义SYSTEM_H。