C 使用\扩展单行注释

C 使用\扩展单行注释,c,comments,c-preprocessor,C,Comments,C Preprocessor,我刚刚注意到,我可以使用\将单行注释扩展到下一行,类似于在预处理器指令中这样做 为什么没有人为这一语言功能发言? 我甚至在书上都没看到。。 什么语言版本支持这一点?它是C语言的一部分,称为线拼接 《K&R》一书谈到了这一点 以反斜杠字符\结尾的行通过删除反斜杠和 下面是换行符。这发生在划分为令牌之前 这发生在预处理阶段 因此,可以使单行注释看起来像多行注释 //This is \ still a single line comment 字符串的情况也是如此 char str[]="Hello

我刚刚注意到,我可以使用
\
将单行注释扩展到下一行,类似于在预处理器指令中这样做

为什么没有人为这一语言功能发言? 我甚至在书上都没看到。。 什么语言版本支持这一点?

它是C语言的一部分,称为线拼接

《K&R》一书谈到了这一点

以反斜杠字符\结尾的行通过删除反斜杠和 下面是换行符。这发生在划分为令牌之前

这发生在预处理阶段

因此,可以使单行注释看起来像多行注释

//This is \
still a single line comment
字符串的情况也是如此

char str[]="Hello \
world. This is \
a string";
编辑:如注释中所述,单行注释在ANSI C中不存在,但作为C99标准的一部分引入,尽管许多编译器已经支持它

,

除了字符常量、字符串文字或注释外,字符//引入的注释包括所有多字节字符,最多包括但不包括下一个新行字符。检查此类注释的内容只是为了识别多字节字符并找到终止的新行字符

就线路拼接而言,C89本身对其进行了规定

  • 删除新行字符和前一个反斜杠字符的每个实例,拼接物理源行以形成逻辑源行。不为空的源文件应以新行字符结尾,其前面不得紧跟反斜杠字符

  • 查看KamiKaze的答案,查看C99的相关部分。

    这不是注释的特征,而是语言的一般特征,因为它适用于所有换行符

    在中可以找到以下内容:

    5.1.1.2翻译阶段

  • 删除紧跟新行字符的反斜杠字符()的每个实例,将物理源行拼接成逻辑源行。只有任何物理源线上的最后一个反斜杠才有资格成为此类拼接的一部分。非空的源文件应以新行字符结尾,在进行任何此类拼接之前,该新行字符前不得紧跟反斜杠字符 因此,它至少符合C99的标准。 关于它的讨论并不多,因为相关的用例(大型宏和字符串除外)非常罕见。如果你需要多行注释(C中的标准注释,//以后从C++中添加),你可以使用< /P>
    /* multi
       line
       comment
    */
    

    除了大型宏和字符串之外,任何用法都会使代码更难阅读,甚至可能使代码变得非常混乱。因此,一般情况下,除了提到的小生境之外,它不会被使用。

    虽然
    \
    确实会在单行注释的末尾有效地转义换行,将该行与以下行拼接(就像在任何其他行上一样),但您可以声称这是标准中的一个缺陷。无论如何,这种情况令人难以置信地困惑。你可能认为这两个事实都是正确的:

  • 单行注释语法
    /
    将行的其余部分(直到下一个换行符)转换为注释,该注释不会以任何方式解释,即被忽略

  • 在任何一行的末尾,一个
    \
    字符消除换行符并将该行拼接到下一行

  • 但这两条规则基本上是冲突的,;看起来它们不可能同时都是真的

    事实上,根据定义,第二条规则“获胜”,第一条规则必须说明,除了检查最后一个字符是否为
    \
    ,在这种情况下,它保留了行拼接的含义外,其余的行不会以任何方式被解释

    (现在,如果你是一名编译器作者或语言律师,当然,你不会这么想。如果你是一名编译器作者或语言律师,你知道
    \
    是在编译的早期阶段,在注释被解析之前被处理的,这意味着第一条规则是完全正确的。但大多数人不这么认为类似于nk的编译器编写者和语言律师。)


    我的观点是,这种情况基本上充满了危险。我敢打赌,一定有编译器或其他语言处理器会弄错。我会敦促任何一个头脑清醒的程序员不要依赖这一点,不要在任何包含单行注释的行尾加上
    \
    。(如果我正在编写编译器或其他语言处理器,我会尝试对此发出警告。)

    在标记化和注释处理之前,在解析的第一阶段,从源代码中删除
    \
    后跟换行符的每个实例

    因此,通过使用
    \
    (或
    ??/
    trigraph序列)转义此换行符,可以将单行注释扩展到源代码的下一行:

    请注意stackoverflow代码高亮显示程序是如何被这个技巧愚弄的,并且不会将注释行的末尾着色

    此功能可能会被进一步滥用,从而产生非常奇怪的评论:

    /\
    /\  This is a single line comment /\
    \/                                \/
    
    
    /\
    *\ This is a multi-line comment
    *\
    /
    
    任何代币都可以通过这种方式破碎。请检查此角盒:


    注释或
    ?注释也可以通过
    *
    扩展../*注释*\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu*/@Gopi注释
    /
    您只需转义
    换行
    ,基本上它保持单行注释。我刚刚测试过,它也适用于字符串。我可以在新行中传输字符串,而无需额外的一对注释“s,尽管我没有识别。每对反斜杠和换行符都会被预处理器删除。引用c11标准,5.1.1.2:“删除紧跟着新行符的反斜杠字符()的每个实例,将物理源行拼接成逻辑源行。”我相信单行字符
    /\
    /\  This is a single line comment /\
    \/                                \/
    
    
    /\
    *\ This is a multi-line comment
    *\
    /
    
    \
    r\
    et\
    urn\
     0x7\
    ffff;\