“如果源文件不为空且不以换行符结尾,或者在任何此类拼接发生之前以换行符结尾且紧接反斜杠字符结尾,则应将其视为附加新的-line 字符被附加到文件中。”
翻译阶段 2 的第二部分(N3485 中的第 2.2.2 节)基本上说如果源文件不以换行符结尾,编译器应该将其视为已完成。
否 - 它表示如果文件“不为空”并且不以换行符结尾,则添加换行符
但是,如果我正确阅读它,它会对空源文件产生明确的例外,这些文件仍然是空的。
同意。
我无法弄清楚源文件是否为空或仅包含换行符会产生影响的任何情况。我希望有人可以阐明这一要求背后的原因。
考虑一个名为“header.h”的头文件,最后一行如下所示,没有尾随换行符:
#endif // #ifndef INCLUDED_HEADER_H
说 another.cc 包括它如下:
#include "header.h"
#include "another.h"
解析 another.cc 时,header.h 中的文本将替换指定包含它的行。天真地做,这将导致:
#endif // #ifndef INCLUDED_HEADER_H#include "another.h"
显然,编译器将无法对 执行操作#include "another.h"
,因为它是在 header.h 中开始的注释的一部分。
因此,不完整规则的规则避免了这些问题(这可能非常难以发现)。
If the file was empty anyway, this problem doesn't manifest: there's nothing like the #endif
to be prepended to the next line in the including file....