C++单行注释后跟多行注释中的\ transforms

Emi*_*rea 45 c c++

它在C++标准中的哪个部分记录了如果使用//some comment\样式注释一行(在行放置的末尾\),注释将转换为多行的功能?

用g ++ 4.8和VS 2012测试

//some interesting stuff\
another interesting stuff\
etc
Run Code Online (Sandbox Code Playgroud)

Woj*_*wka 94

C++标准,2.2 - 翻译阶段.第二阶段包括

\删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.

和第3阶段包括

每个注释都被一个空格字符替换

因此,在注释之前会识别行末尾的反斜杠.

C的等效阶段2和3可以在C标准中找到(我草案中的5.1.1.2翻译阶段).

  • 谁在地球上投了这个答案呢?它是最完整和最正确的(比我的更好). (6认同)
  • 反斜杠换行符通常用于长宏定义. (6认同)
  • @DebugErr*intent*是在对物理源线(例如,穿孔卡)的长度施加硬上限的系统上,你可以用\ _newlines机械地分割每个太长的线而不必解析代码.我怀疑这种情况在现实生活中曾经发生过,但这才是最初的理由. (5认同)
  • 请记住,`//`-comments对于C系列语言来说相对较新,特别是比预处理器更新*.与任何进化的东西一样,必须解决冲突,并且分辨率并不总是最优雅的. (3认同)

Jam*_*nze 12

\在编译器开始查找注释和结束注释之前,在翻译过程的早期就消除了A 后跟新行,参见§2.2,翻译阶段.


Moh*_*ain 11

你想知道C或C++吗?(编辑:原始问题OP要求C/C++)

对于C以下部分来自ISO/IEC 9899:TC2委员会草案 - 2005年5月6日WG14/N1124回答了您的问题.

5.1.1.2翻译阶段

[2]删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分.非空的源文件应以换行符结尾,在进行任何此类拼接之前,该换行符不应立即以反斜杠字符开头.

对于C++,您可以参考en.cppreference.com上的第2阶段

1)每当反斜杠出现在一行的末尾(后面跟着换行符)时,反斜杠和换行都会被删除,将两条物理源行合并为一条逻辑源行.这是一次单行操作,以两个反斜杠结尾的行后跟一个空行不会将三行合并为一行.如果在此阶段形成通用字符名称(\ uXXX),则行为未定义.
2)如果非空源文件在此步骤之后没有以换行符结尾(无论它最初没有换行符,还是以反斜杠结尾),则行为未定义(直到C++ 11)终止换行符是添加(自C++ 11以来)

如果您的当前行是单行注释,则后续行将作为注释连续消化.


cer*_*wny 7

http://www.cplusplus.com/forum/general/33653/

您可以在代码中的任何位置添加"\",并且将忽略换行符.

作为标准2.2段的更好参考:

删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分.因此,如果生成与通用字符名称的语法匹配的字符序列,则行为未定义.一个非空的并且不以换行符结尾的源文件,或者在任何此类拼接发生之前以反斜杠字符开头的新行字符结尾的源文件,应该被处理,就像另一个新文件一样 - 行字符被附加到文件中.

如果文件中的最后一个字符是反斜杠,会发生什么情况并不清楚.在这种情况下,可能添加换行符的结果不应该是行拼接而是反斜杠预处理令牌(在阶段7中将被诊断为无效令牌),但应该拼写出来.

  • 您引用的引用不是很好,并没有真正解释从标准角度发生的情况. (3认同)

Shl*_*blu 5

根据工作草案,编程语言C++标准,第2章词汇约定,2.1 - 2):

将删除新行字符和紧接在前的反斜杠字符的每个实例,反斜杠字符()后面紧跟换行字符,拼接物理源行以形成逻辑源行.只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分.

这也适用于评论,这仍然是最终版本的一部分.