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

时间:2014-08-06 10:08:35

标签: c++ c

在C ++标准中,如果使用//some comment\样式(在行的末尾放置\)注释某行,则该注释会转换为多行?

使用g ++ 4.8和VS 2012测试

//some interesting stuff\
another interesting stuff\
etc

6 个答案:

答案 0 :(得分:94)

C ++标准,2.2 - 翻译阶段。第2阶段包括

  

删除后跟新行字符的反斜杠字符(\)的每个实例,   拼接物理源线以形成逻辑源线。

和第3阶段包括

  

每个评论都被一个空格字符替换

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

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

答案 1 :(得分:12)

一个\后跟一个新行在很早就消除了 翻译过程,在编译器开始寻找之前 评论和评论结束,见§2.2,阶段性 翻译。

答案 2 :(得分:11)

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

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

5.1.1.2翻译阶段

  

[2]反斜杠字符()的每个实例紧跟一个   删除换行符,拼接物理源行以形成   逻辑源代码行。只有任何物理来源的最后反斜杠   线路有资格成为这种拼接的一部分。源文件   不是空的,应以新行字符结尾,不得为   在任何此类之前立即加上反斜杠字符   拼接发生。

对于C ++,您可以参考Phase 2 at en.cppreference.com

  

1)每当反斜杠出现在一行的末尾(立即   其次是反斜杠和换行符   删除,将两个物理源行合并为一个逻辑源   线。这是一次单行操作,一行以两个结尾   反斜杠后跟一个空行不会组合三行   一个)。如果在此形成通用字符名称(\ uXXX)   阶段,行为未定义。
2)如果非空源文件   在此步骤之后不会以换行符结尾(是否没有   最初的换行符,或以反斜杠结束)行为是   undefined(直到C ++ 11)添加了终止换行符   (自C ++ 11起)

如果您的当前行是单行注释,则会将以下行作为注释连续消化。

答案 3 :(得分:7)

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

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

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

  

反斜杠字符()的每个实例后面紧跟一个换行符   删除字符,拼接物理源行   形成逻辑源代码行。任何物理上只有最后一个反斜杠   源线应有资格成为此类拼接的一部分。如果,如   结果,一个匹配a的语法的字符序列   生成通用字符名称,行为未定义。一个   源文件非空且不以换行符结尾   字符,或以紧接在前面的换行符结尾   在进行任何此类拼接之前,应使用反斜杠字符   处理就好像附加了一个额外的换行符   文件。

关于如果最后一个角色发生了什么,目前尚不清楚 file是反斜杠。在这种情况下,大概是添加的结果 换行不应该是行拼接而是反斜杠 预处理令牌(将被诊断为无效令牌) 阶段7),但应该明确说明。

答案 4 :(得分:5)

根据Working Draft, Standard for Programming Language C++,第2章词汇惯例,2.1 - 2):

  

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

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

答案 5 :(得分:-6)

它在C ++标准中,就像C ++语言的一切一样。你可以免费下载C ++标准的草稿(除了参与设计C ++语言的人和编译器编写者之外几乎所有人都足够好),只需google for" C ++标准草案"。