C++ 叮当声:单行注释中用空格分隔的反斜杠和换行符

C++ 叮当声:单行注释中用空格分隔的反斜杠和换行符,c++,clang,C++,Clang,为什么会这样(): 发出叮当声警告: warning: backslash and newline separated by space [-Wbackslash-newline-escape] ? 看起来该代码完全有效,没有任何陷阱。来自C++14草稿: 2.2个翻译阶段[法律阶段] 删除紧跟着新行字符的反斜杠字符()的每个实例,将物理源行拼接到 形成逻辑源行。只有任何物理对象上的最后一个反斜杠 电源线应有资格成为此类拼接的一部分。除了 对于以原始字符串文字还原的拼接,如果拼接导致 与字符串

为什么会这样():

发出叮当声警告:

warning: backslash and newline separated by space [-Wbackslash-newline-escape]
?

看起来该代码完全有效,没有任何陷阱。

来自C++14草稿:

2.2个翻译阶段[法律阶段]

  • 删除紧跟着新行字符的反斜杠字符()的每个实例,将物理源行拼接到 形成逻辑源行。只有任何物理对象上的最后一个反斜杠 电源线应有资格成为此类拼接的一部分。除了 对于以原始字符串文字还原的拼接,如果拼接导致 与字符串的语法匹配的字符序列 通用字符名,行为未定义。源文件 不为空且不以新行字符结尾,或 以紧跟在反斜杠前面的新行字符结尾的 在进行任何此类拼接之前,应按照以下方式处理字符: 如果文件中追加了其他新行字符
  • 正是它的第一句话给了你警告

    在您的示例代码中:

    int main()
    {
        // my pretty comment /\
        int x;
        int y = x;    
    }
    
    intx行将加入到上面行中的注释中,并将在翻译的下一阶段删除。所以你犯了一个错误:

    错误:使用未声明的标识符“x”

    然而

    int main()
    {
        // my pretty comment /\   
        //
    }
    
    是有效的,不会导致错误。您可能会注意到,
    g++
    (没有
    -Wall
    )不会在此处发出警告。这看起来像是无用的警告,但我认为编译器可能会将其视为新行字符转义的失败。所以,最好在这里给你一个警告

    我们需要这个警告吗

    事实上,不,我们这里不需要。但这只是一个诊断警告,最好有这样的警告,以便能够检测到可能的问题,而不是根本没有警告

    我想,这也是一个原因,比如:

  • 人们通常不会逃离
    空间
    。为什么?:)

  • 对于多行注释,这里有
    /*
    */
    序列

  • 从C++14草稿中:

    2.2个翻译阶段[法律阶段]

  • 删除紧跟着新行字符的反斜杠字符()的每个实例,将物理源行拼接到 形成逻辑源行。只有任何物理对象上的最后一个反斜杠 电源线应有资格成为此类拼接的一部分。除了 对于以原始字符串文字还原的拼接,如果拼接导致 与字符串的语法匹配的字符序列 通用字符名,行为未定义。源文件 不为空且不以新行字符结尾,或 以紧跟在反斜杠前面的新行字符结尾的 在进行任何此类拼接之前,应按照以下方式处理字符: 如果文件中追加了其他新行字符
  • 正是它的第一句话给了你警告

    在您的示例代码中:

    int main()
    {
        // my pretty comment /\
        int x;
        int y = x;    
    }
    
    intx行将加入到上面行中的注释中,并将在翻译的下一阶段删除。所以你犯了一个错误:

    错误:使用未声明的标识符“x”

    然而

    int main()
    {
        // my pretty comment /\   
        //
    }
    
    是有效的,不会导致错误。您可能会注意到,
    g++
    (没有
    -Wall
    )不会在此处发出警告。这看起来像是无用的警告,但我认为编译器可能会将其视为新行字符转义的失败。所以,最好在这里给你一个警告

    我们需要这个警告吗

    事实上,不,我们这里不需要。但这只是一个诊断警告,最好有这样的警告,以便能够检测到可能的问题,而不是根本没有警告

    我想,这也是一个原因,比如:

  • 人们通常不会逃离
    空间
    。为什么?:)

  • 对于多行注释,这里有
    /*
    */
    序列


  • 如果没有任何陷阱,您的代码肯定不是完全有效的

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


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

    如果没有任何陷阱,您的代码肯定不是完全有效的

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


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

    直接后跟换行符“escapes”的反斜杠将删除换行符。这两条线连接在一起。从类似于您的代码的内容来看,情况并非如此,因为空格是。。。隐形。@dyp,也许我的问题不好,但我想问,为什么我们需要这样的警告?是的,在这样的情况下会出现问题,但在上面的情况下它是无用的。我猜触发警告(编译器诊断)的代码根本不会尝试检测它是否是实际问题。这样的试探法通常很复杂,可能会产生误判,因为这很危险。现在还不清楚你真正的意思是什么(也许你是无意中把这个空间放在那里的)。对代码进行一些不可见的更改(删除空格)可能会显著改变代码的含义。还要注意,许多代码样式需要删除尾随空格,有些编辑器可以自动删除尾随空格。只需在该换行符之前和反斜杠之后添加空格。反斜杠后面紧跟着一个换行符“escapes”/即可删除该换行符。这两条线连接在一起。事实并非如此