【问题标题】:Source line length limit源行长度限制
【发布时间】:2012-05-09 15:59:44
【问题描述】:

所有编译器需要接受的源代码行的最大长度是多少?它在 C++11 中改变了吗?如果有,旧值是多少?

我问这个问题是因为我正在做一些繁重的预处理器巫术(不幸的是,模板不会削减它),并且这样做会很快使线条变大。我想保持安全,所以我不必担心平台 Y 上的编译器 X 可能会因为行太长而拒绝我的代码。

【问题讨论】:

  • 我宁愿检查是否有办法避免预处理器巫毒。这比依赖于实现细节更有可能
  • 我认为让 C++ 编译器接受无限行长并不难,但我从来没有写过。
  • @Fanael,如果你还没有问过,可能值得解释一下。
  • @MarkRansom:当然,但是有标准,也有实现。问题是关于前者的。
  • @Mark Ransom 我认为让 C++ 编译器接受无限行长是不可能的,但我永远无法确定 b/c 我的微不足道的计算机只存储有限的源文件。

标签: c++ c++11 standards


【解决方案1】:

C++2003,附录 B,(资料性) 实现数量(抱歉,手边没有C++2011)

2) 限制可能会限制数量,包括下述数量或其他数量。括号内的数字 建议在每个数量之后作为该数量的最小值。然而,这些数量是 仅作为指导方针,并不能确定合规性。

  • 一个逻辑源代码行中的字符 [65 536]。

你没有问这些,但它们可能也有用:

  • 在完整表达式中嵌套括号表达式的级别 [256]。
  • 在一个翻译单元 [65 536] 中同时定义宏标识符。
  • 一个宏调用中的参数 [256]。
  • 内部标识符或宏名称中的字符数 [1 024]。
  • 在一个翻译单元 [65 536] 中同时定义宏标识符。
  • 一个宏定义中的参数 [256]。


后记:值得注意的是什么是“一个逻辑源代码行”。 逻辑源代码行是您之后所拥有的:
  • 物理源文件字符映射到基本源 字符集
  • 三字 序列 (2.3) 被相应的单字符内部表示替换
  • 每个换行符和前一个反斜杠字符的实例都被删除

逻辑源代码行是您之前所拥有的:

  • 源文件被分解成预处理标记
  • 执行预处理指令并扩展宏调用。

[引自C++ 2003, 2.1 翻译阶段]

所以,如果 OP 担心宏扩展到超出合理的行长,我的回答是无关紧要的。如果 OP 担心他的源代码(在处理 \\n 之后)可能太长,我的回答是成立的。

【讨论】:

  • 只是为了确认,这在 C++11 中是一样的。
  • +1:这与 C++11 中的相同:“— 一个逻辑源代码行中的字符 [65 536]。”附录 B.2
  • 简单地说:由于行太长,允许编译器拒绝(或执行其他任何操作)包含通常“hello world”代码的文件。那是未定义的行为。我想知道为什么您的回答中没有明确说明违反“长线”限制的后果......
  • @JohannesSchaub-litb:感谢您的回复。今天我参与了一个 C++ 对话,这个对话最终沦为对 Linus Torvalds 的嘲弄(如你所知,他并不关心 C++)。让你参与是一个错误。对不起。不过,如果你想知道,我指的是你说你不喜欢单元测试。
猜你喜欢
  • 2013-10-08
  • 2013-10-25
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多