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翻译阶段
/* 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;\