Clang:在单行注释中以空格分隔的反斜杠和换行符
clang: backslash and newline separated by space in single line comment
为什么这个(live):
int main()
{
// my pretty comment /
//
//
}
给出clang的警告:
warning: backslash and newline separated by space [-Wbackslash-newline-escape]
?
看起来代码完全有效,没有任何缺陷。
来自c++ 14草案[4296]:
2.2翻译阶段[lex.phases]
- 每个紧跟着新行字符的反斜杠字符()实例都被删除,将物理源行拼接到形成逻辑源行。只有最后一个反斜杠源线应符合作为这种接头的一部分的条件。除了对于在原始字符串文字中还原的拼接,如果拼接结果为的语法匹配的字符序列Universal-character-name表示未定义行为。源文件它不为空且不以换行字符结尾,或者它以一个换行字符结尾,前面紧接一个反斜杠字符在任何这样的拼接发生之前,应处理为
正是它的第一句话给了你警告。
在示例代码中:
int main()
{
// my pretty comment /
int x;
int y = x;
}
int x;
行将加入到上面行的注释中,并将在翻译的下一阶段被删除。所以你得到了一个错误:
然而错误:使用未声明的标识符'x'
int main()
{
// my pretty comment /
//
}
是有效的,不会导致错误。您可能会注意到,g++
(没有-Wall
)在这里不会给出警告。它看起来像无用的警告,但我认为编译器可能会将其视为可能的新行字符转义失败。所以,最好在这里给你一个警告。
事实上,不,我们这里不需要它。但这只是一个诊断警告,有这样的警告,以便能够发现可能的问题,总比根本没有要好。我们需要这个警告吗?
我想,这里也有一个原因,如:
人们通常不会逃离
spaces
。为什么?:)对于多行注释,这里是
/*
和*/
序列。
你的代码绝对不是完全有效的。
行尾的反斜杠用于合并两个源代码行。行尾有一个反斜杠,但中间有一个空格,很可能是合并两行源代码的失败尝试,因此应该得到一个非常严厉的警告。
在你的例子中,反斜杠只是用来迷惑人的。更糟糕的是,把它去掉。
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 正在读取由换行符分隔的文本文件.unix上的C++
- 是否用换行符分隔的多个枚举,然后逗号始终可移植
- 从用换行符和逗号分隔的txt文件中读取
- 如何在C++中将空格和换行符分隔的整数读取到2D数组中
- 将文件读取为逗号和换行符分隔的矢量
- 查找由换行符分隔的字符串中的特定文本
- 在无符号字符数组中读取充满字符串(用换行符分隔)的文件(反之亦然)的最快方法是什么?
- 从文件中读取空格分隔的数字,直到换行符
- Clang:在单行注释中以空格分隔的反斜杠和换行符
- 读取由空格或换行符分隔的输入.