在C:The Complete Reference中,Herbert Schildt说
标头通常是文件,但它们不一定是文件.编译器允许在内部预定义标头的内容.但是,出于所有实际目的,标准c头文件包含在与其名称对应的文件中.
如何在不成为文件的情况下存在标题?这篇文章的主题是什么?因为.h文件扩展名与标题一起使用.
C标准确实对#include预处理指令引用的头文件和源文件有所区别:
6.10.2源文件包含
约束
1
#include指令应标识可由实现处理的头文件或源文件.语义
2表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# include <h-char-sequence> new-line搜索一系列实现定义的位置,以查找由<和>分隔符之间的指定序列唯一标识的标头,并使标头的整个内容替换该指令.如何指定场所或标识的头是实现定义的.
3表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# include "q-char-sequence" new-line导致由"delimiters"之间的指定序列标识的源文件的全部内容替换该指令.以实现定义的方式搜索指定的源文件.如果不支持此搜索,或者搜索失败,该指令被重新处理,就像它读取一样
Run Code Online (Sandbox Code Playgroud)# include <h-char-sequence> new-line使用原始指令中相同的包含序列(包括>字符,如果有的话).
编译器可以实现一种方案,其中标准头实际上不存储为文件系统中的文件.但是该指令#include "filename.h"被指定为首先以系统特定的方式搜索文件,然后搜索标准头文件,就像指令一样#include <filename.h>
需要注意的是,文件扩展名.c和.h纯粹是区分含含实际的代码和数据定义的声明和文件,文件的约定.除了用于标准头文件的名称之外,标准中的任何内容都不需要此约定.有些人使用具有不同扩展名的其他约定或根本没有扩展来满足特定需求,但绝大多数C程序员都认为这是不好的做法.
Shafik Yaghmour提供了C99基本原理的引用,以回答一个类似的问题,指出委员会对这个问题的意图:https://stackoverflow.com/a/27262904/4593267