标题必然是文件吗?

Pra*_*tic 13 c++ standards c-preprocessor c++11

TC对这个问题的回答留下了一个有趣的评论:

为什么不在c ++中包含守卫默认值?

TC说:

有"标题",还有"源文件"."标题"不需要是实际文件.

这是什么意思?

仔细阅读标准,我看到对"头文件"和"标题"的大量引用.但是,关于#include,我注意到该标准似乎引用了"标题"和"源文件 ".(C++ 11,§16.2)

A preprocessing directive of the form
    # include < h-char-sequence> new-line
searches a sequence of implementation-defined places for a header identified uniquely
by the specified sequence between the < and > delimiters, and causes the replacement
of that directive by the entire contents of the header. How the places are specified
or the header identified is implementation-defined.
Run Code Online (Sandbox Code Playgroud)

A preprocessing directive of the form
    # include " q-char-sequence" new-line
causes the replacement of that directive by the entire contents of the source *file*
identified by the specified sequence between the " delimiters. The named source *file*
is searched for in an implementation-defined manner.
Run Code Online (Sandbox Code Playgroud)

我不知道这是否重要.可能是C++上下文中的"标题"明确地表示"头文件",但单词"sources"将是不明确的,因此"标题"是简写,但"来源"不是.或者可能是C++编译器允许支架包含的余地,只需要像发生文本替换一样.

那么什么时候标题(文件)不是文件?

TC在以下评论中提到的脚注非常直接:

174)标题不一定是源文件,标题名称中<和>分隔的序列也不一定是有效的源文件名(16.2).

Die*_*ühl 15

对于标准头文件"文件",C++标准并没有真正授权编译器使用文件,或者文件(如果使用文件)实际上看起来像C++文件.相反,指定标准头文件以使C++程序可以使用某组声明和定义.

对文件的替代实现可以是在编译​​器中表示为数据结构的容易打包的声明集,其在使用相应的#include-directive 时可用.我不知道任何编译器确实如此,但clang开始实现一个模块系统,该模块系统使得标头可以从一些已处理的格式中获得.


Sha*_*our 7

它们不一定是文件,因为C和C++预处理器几乎完全相同,因此考虑C99的基本原理是合理的.如果我们看一下国际标准编程语言的基本原理-C,它在7.1.2 标准标题部分中说(强调我的):

在许多实现中,头的名称是特殊目录中的文件的名称.但是,此实现技术不是必需的:标准不对文件名可能在任何系统上采用的形式做出任何假设.因此,如果实现如此选择,则标题可以具有特殊状态.标准标题甚至可以内置到翻译器中,前提是它们的内容在明确包含之后才会"已知".允许这些标题"文件"被"内置"到翻译器的一个目的是允许在独立环境中将C语言实现为解释器,其中唯一的"文件"支持可以是网络接口.