语言律师 - 空C++文件的效用是什么?
language lawyer - What's the utility of an empty C++ file?
翻译阶段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
更重要的了。。。。
- 文件系统:复制功能的速度秘诀是什么
- 在C++中包含原型文件的正确方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 引用文件的适当方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 将位字符串转储到二进制文件的最佳方法是什么
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 通过boost asio iostream下载大文件的最快方法是什么?
- 这个错误可能是什么?ANSI C文件
- 读取二进制文件的惯用C++17标准方法是什么
- 是否可以将要"ShellExecute"的文件包含在 dll 中?如果是这样,"ShellExecute"中的文件位置应该是什么?
- 使用 MSVC 编译时,msdpb* 文件的正确用法是什么?
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- 从包含 IP 标头片段的二进制文件中读取结构的最佳方法是什么
- 使用 openssl 构建静态二进制文件的正确方法是什么?
- 避免遗漏包含相同文件的最佳方法是什么?
- Arduino IDE中自定义库类的.h文件编译错误的原因是什么
- 头文件中.h扩展名的意义是什么?
- 获取 csv 文件中行数的最快方法是什么?