【问题标题】:C++ single line comments followed by \ transforms in multiline commentC++ 单行注释后跟 \ 在多行注释中转换
【发布时间】:2014-09-29 05:23:59
【问题描述】:

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

使用 g++ 4.8 和 VS 2012 测试

//some interesting stuff\
another interesting stuff\
etc

【问题讨论】:

  • @JoshuaTaylor 怎么是重复的?链接的问题询问反斜杠后的空格,而此问题仅询问反斜杠。
  • @AlvinWong,我不知道,但显然他得到了其他人的同意。
  • @JoshuaTaylor 经过 2 年的 SO,为什么你不知道什么是重复问题?当一个问题的答案包含对另一个问题有用的部分时,这并不意味着该问题是重复的。
  • @JoshuaTaylor 我的解释是,链接的问题询问是否在换行符之前有一个额外的空格时,反斜杠续行是否仍然有效,这是一个不同的问题。

标签: c++ c


【解决方案1】:

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

每个反斜杠字符 (\) 的实例后面紧跟一个换行符都会被删除, 将物理源线拼接成逻辑源线。

第三阶段包括

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

所以行尾的反斜杠在 cmets 之前被识别。

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

【讨论】:

  • 到底谁对这个答案投了反对票?这是最完整和正确的(例如,比我的要好)。
  • 如果不混淆,这怎么能有用?
  • @DebugErr 意图是在一个对物理源行(例如穿孔卡片)的长度施加硬上限的系统上,您可以机械地分割每条太长的行使用 \-newlines 而无需解析代码。我怀疑这种情况在现实生活中曾经发生过,但这是最初的理由。
  • 反斜杠换行符常用于长宏定义中。
  • 请记住,//-cmets 对于 C 系列语言来说相对较新,尤其是比预处理器更新很多。与任何发展的事物一样,存在必须解决的冲突,而解决方案并不总是最优雅的。
【解决方案2】:

\ 后跟一个新行在很早就被淘汰了 翻译过程,在编译器开始寻找之前 cmets 和 cmets 的结尾,参见 §2.2,阶段 翻译。

【讨论】:

    【解决方案3】:

    您想了解 C 还是 C++? (编辑:在原始问题 OP 要求 C/C++)

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

    5.1.1.2 翻译阶段

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

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

    1) 每当反斜杠出现在行尾时(立即 后跟换行符),反斜杠和换行符都是 删除,将两条物理源行合并为一个逻辑源 线。这是一个单遍操作,一行以两个结尾 后跟空行的反斜杠不合并三行 合为一)。如果一个通用字符名称 (\uXXX) 在此形成 阶段,行为未定义。
    2) 如果非空源文件确实 此步骤后不以换行符结尾(无论是否有 换行符,或者以反斜杠结尾)行为是 未定义(C++11 前)添加了终止换行符 (C++11 起)

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      不清楚如果最后一个字符在 文件是反斜杠。在这种情况下,大概是添加的结果 换行符不应该是一个线拼接,而是一个反斜杠 预处理令牌(将被诊断为无效令牌 第 7 阶段),但应该详细说明。

      【讨论】:

      • 你引用的参考文献不是很好,也没有从标准的角度真正解释发生了什么。
      • 附上标准段落作为更好的参考,但我可以看到其他人已经这样做了。
      • “反斜杠预处理令牌(将在第 7 阶段被诊断为无效令牌)”——不,如果预处理令牌作为已删除评论的一部分出现,则无法生成诊断在第 7 阶段之前。尾部反斜杠是无害的(并且不是单独的预处理标记)。
      【解决方案5】:

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

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

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

      【讨论】:

      • 引用的页面没有回答他的问题(而且总的来说真的不是很有用)。
      【解决方案6】:

      它在 C++ 标准中,就像关于 C++ 语言的所有内容一样。您可以免费下载 C++ 标准草案(对于几乎所有人,除了参与 C++ 语言设计和编译器作者的人,草案已经足够好了),只需在谷歌上搜索“C++ 标准草案”。

      【讨论】:

      • 它没有回答问题。 OP 添加问题的原因是他在标准中找不到信息。
      • @cerkiewny,这是一个假设。帖子中没有任何地方明确表示他们找不到答案。他们,也许,不喜欢看;不清楚。
      • 看看这篇文章:meta.stackexchange.com/questions/15650/… 它解释了为什么不应该真正使用你回答问题的方法。
      • ...但是,这不是问题的答案。 op 专门要求在标准中 in 的位置。似乎并非总是不顾一切地寻找标准来澄清。
      猜你喜欢
      • 2010-12-03
      • 2012-07-28
      • 2011-10-27
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2022-01-23
      • 2013-03-04
      • 2014-01-15
      相关资源
      最近更新 更多