标题是否存在而不是文件?

问题描述 投票:10回答:3

在C:The Complete Reference中,Herbert Schildt说

标头通常是文件,但它们不一定是文件。编译器允许在内部预定义标头的内容。但是,出于所有实际目的,标准c头文件包含在与其名称对应的文件中。

如何在不成为文件的情况下存在标题?这篇文章的主题是什么?因为.h文件扩展名与标题一起使用。

c header-files
3个回答
6
投票

C标准确实对#include预处理指令引用的头文件和源文件有所区别:

6.10.2源文件包含

约束

1 #include指令应标识可由实现处理的头文件或源文件。

语义

2表单的预处理指令

# include <h-char-sequence> new-line

搜索一系列实现定义的位置,以查找由<和>分隔符之间的指定序列唯一标识的标头,并使标头的整个内容替换该指令。如何指定场所或标识的头是实现定义的。

3表单的预处理指令

# include "q-char-sequence" new-line

导致由“delimiters”之间的指定序列标识的源文件的全部内容替换该指令。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,该指令被重新处理,就像它读取一样

# include <h-char-sequence> new-line

使用原始指令中相同的包含序列(包括>字符,如果有的话)。

编译器可以实现一种方案,其中标准头实际上不存储为文件系统中的文件。但指令#include "filename.h"被指定为首先以系统特定的方式搜索文件,然后搜索标准头文件,就好像该指令已经是#include <filename.h>

请注意,文件扩展名.c.h纯粹是用于区分包含声明的文件和包含实际代码和数据定义的文件的约定。除了用于标准头文件的名称之外,标准中的任何内容都不需要此约定。有些人使用具有不同扩展名的其他约定或根本没有扩展来满足特定需求,但绝大多数C程序员都认为这是不好的做法。

Shafik Yaghmour提供了C99基本原理的引用,以回答一个类似的问题,指出委员会对这个问题的意图:https://stackoverflow.com/a/27262904/4593267


4
投票

C标准明确说明标题是一个文件,所以我认为不是。

6.10.2源文件包含

#include指令应标识可由实现处理的头文件或源文件。

但是,作为给定系统的文件的是实现定义的。它理论上可以是硬件端口,管道或其他一些愚蠢的东西。大多数主要操作系统都可以将端口或管道视为文件(例如,在Windows中,文件和硬件端口使用相同的功能打开。)


0
投票

假设的C编译器不需要文件系统。它可以处理#include指令:

  • 它可以查询数据库(IIRC,一些IBM编译器在20世纪80年代做过,数据库包含AST的缓存)
  • 它可以处理标准包括否则,即它遇到#include <stdio.h> - 在某些条件 - 改变其内部状态(按照标准要求)而不访问任何头文件。换句话说,标准标题可以是“内置”的。

实际上,我今天所知的所有C编译器都使用文件系统来标题。但阅读关于precompiled headers in GCC

顺便说一句,在C11规范n1570中提到“头文件”并不需要文件系统(如通常的操作系统)。

© www.soinside.com 2019 - 2024. All rights reserved.