Clang:在单行注释中以空格分隔的反斜杠和换行符

clang: backslash and newline separated by space in single line comment

本文关键字:换行符 分隔 空格 单行注释 Clang      更新时间:2023-10-16

为什么这个(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)在这里不会给出警告。它看起来像无用的警告,但我认为编译器可能会将其视为可能的新行字符转义失败。所以,最好在这里给你一个警告。

    我们需要这个警告吗?

    事实上,不,我们这里不需要它。但这只是一个诊断警告,有这样的警告,以便能够发现可能的问题,总比根本没有要好。

    我想,这里也有一个原因,如:

    1. 人们通常不会逃离spaces。为什么?:)

    2. 对于多行注释,这里是/**/序列。

    你的代码绝对不是完全有效的。

    行尾的反斜杠用于合并两个源代码行。行尾有一个反斜杠,但中间有一个空格,很可能是合并两行源代码的失败尝试,因此应该得到一个非常严厉的警告。

    在你的例子中,反斜杠只是用来迷惑人的。更糟糕的是,把它去掉。