语言律师 - 空C++文件的效用是什么?

language lawyer - What's the utility of an empty C++ file?

本文关键字:是什么 文件 律师 C++ 语言      更新时间:2023-10-16

翻译阶段2的第二部分(N3485中的2.2.2节)基本上说,如果源文件没有以换行符结束,编译器应该将其视为换行符。

然而,如果我读得正确,它会对空的源文件进行明确的例外处理,这些文件仍然是空的。

确切的文本(加上强调)是:

紧接着一个新行字符的反斜杠字符()的每个实例都被删除,将物理源行拼接成逻辑源行。只有任何物理源线上的最后一个反斜杠才有资格成为此类拼接的一部分。因此,如果生成了与通用字符名语法匹配的字符序列,则行为是未定义的如果源文件不是空的,并且没有以换行符结尾,或者在进行任何此类拼接之前以紧接着反斜杠字符的换行符结束,则应将额外的换行符附加到文件中进行处理

我还没有弄清楚在任何情况下,源文件是空的还是只由换行符组成会有什么不同。

我希望有人能阐明这一要求背后的原因。

这是为了特别支持1994年在国际模糊C代码竞赛中获胜的"最严重的滥用规则"类别:世界上最小的自我复制程序。保证。

我认为这个想法是源文件通常由零行或多行组成,每行由一系列非换行字符组成,后面跟着一行。任何不满足该要求的源文件都需要特殊处理(这样就不会得到由两个不同源文件中的文本组成的行)。

空的C++源文件并不是特别有用,但禁止它是没有意义的。引用子句并不是要区分空文件和只有一行新行的文件(它们之间应该没有真正的区别)。

我想这意味着每一行都以\n结尾,而空文件没有行

预处理器可以用来构造程序源之外的东西,而空行可能很重要——例如,它通常用于分隔文本中的段落。

"如果源文件不是空的,并且没有以换行符结尾,或者在进行任何此类拼接之前以紧接着反斜杠字符的换行符结束,则应将额外的换行符附加到文件中进行处理"

翻译阶段2的第二部分(N3485中的2.2.2节)基本上说,如果源文件没有以换行符结尾,编译器应该将其视为换行符。

否-它说如果文件";不是空的";AND不以换行结束,则添加换行

然而,如果我读得正确,它会对空的源文件进行明确的例外处理,这些文件仍然是空的。

同意。

我还没有弄清楚在任何情况下,源文件是空的还是只由换行符组成会有什么不同。我希望有人能阐明这一要求背后的原因。

考虑一个名为";header.h";最后一行如下,没有尾随换行

#endif  // #ifndef INCLUDED_HEADER_H

假设另一个.cc包含如下内容:

#include "header.h"
#include "another.h"

当解析另一个.cc时,header.h中的文本将替换指定其包含的行。天真地做,这将导致:

#endif  // #ifndef INCLUDED_HEADER_H#include "another.h"

显然,编译器将无法对#include "another.h"执行操作,因为它是header.h中开始的注释的一部分。

因此,不完全规则的规则避免了这些问题(这可能非常难发现)。

如果文件是空的,那么这个问题就不会显现出来:在包含文件的下一行之前,没有什么比#endif更重要的了。。。。