【问题标题】:C/C++ Control Structure Limitations?C/C++ 控制结构限制?
【发布时间】:2010-01-22 17:40:22
【问题描述】:

我听说 VC++(不确定哪个版本)对嵌套的 if 语句的数量有限制(大约 300 个)。代码格式如下:

if (a) ...
else if (b) ...
else if (c) ...
...

我很惊讶地发现这种事情的限制,而且限制是如此之小。我不是在寻找有关编码实践以及为什么要完全避免这种事情的 cmets。

以下是我认为可能有一些限制的列表:

  • 作用域(全局、类或命名空间)中的函数数。
  • 单个语句中的表达式数量(例如复合条件)。
  • 开关中的案例数。
  • 函数的参数数量。
  • 单个层次结构中的类数(继承或包含)。

还有哪些其他控制结构/语言功能有这样的限制?语言标准是否说明了这些限制(可能是实现的最低要求)?有没有人在使用特定的编译器/实现时遇到过这样的特定语言限制?

编辑:请注意,if 语句的上述形式确实是“嵌套的”。相当于:

if (a) { //...
}
else {
    if (b) { //...
    }
    else {
        if (c) { //...
        }
        else { //...
        }
    }
}

【问题讨论】:

  • 代码可能有相同的效果,但不一定相同。
  • 嗯,那是你错的地方。编译器非常关心范围。
  • 从编译器的角度来看,链接的if 语句不是嵌套的,因为一次只有一个条件激活。一些语言有一个else if 结构来使这一点更清楚(就像C 和C++ 预处理器一样)。如果您进入编译器设计,您会发现解析传统的嵌套 if 语句与解析链式 else if 构造有很大不同。
  • @stringray: Neil 和 David 是正确的,从编译器的角度来看,这两段代码并不等同。
  • Stinray:不,你们的样品不一样。范围不同。

标签: c++ c language-implementation


【解决方案1】:

Visual C++ Compiler Limits

C++ 标准建议限制 各种语言结构。这 以下是构造列表 Visual C++ 编译器没有的地方 实施建议的限制。这 第一个数字是建议的限制 第二个数字是限制 由Visual C++实现:

  • 复合语句的嵌套级别, 迭代控制结构,以及 选择控制结构 [256] (256)。

  • 一个宏定义中的参数 [256] (127)。

  • 一个宏调用中的参数 [256] (127)。

  • 字符串中的字符 文字或宽字符串文字(在 连接)[65536](65535)。

  • 嵌套类、结构或 单一的联合定义 结构声明列表 [256] (16)。

  • 构造函数中的成员初始化器 定义[6144](约600, 内存依赖,可以增加 /Zm 编译器选项)。

  • 一个标识符的范围限定 [256] (127)。

  • 嵌套的外部规范 [1024] (10).

  • 模板中的模板参数 声明 [1024] (64)。

【讨论】:

    【解决方案2】:

    语言标准是否说明了什么 关于这些限制(也许是最低限度 实施要求)?

    不,标准对此没有设定最低限度。但是对于实现来说,对此类事情设置和记录硬限制是一种很好的做法,而不是在超出限制时以某种未知的方式失败。

    编辑:标准建议在附件 B 中的一些最低限制 - 实在太多,无法在此处发布,无论如何它们都是建议性的:

    这些限制可能会限制数量 包括以下描述的或 其他。括号中的数字如下 每个数量被推荐为 该数量的最小值。然而, 这些数量仅供参考 并且不确定合规性。

    【讨论】:

    • 我记得,该标准在附录之一的某处设置了一些建议的最低限度。不是吗? (这里没有标准可查)
    • 如果我记得的话,标识符有一些最小长度。哦,好吧,我去看看,但我想不起别的了。
    • 我可以告诉你从来没有写过编译器。
    • @STingRaySC:有一次在 comp.lang.c.moderated 上有一个相当长的讨论,关于编译器需要多难尝试来编译程序以使其符合。到最后,几乎完全达成共识,从技术上讲,一个除了打印“超出编译器限制”之外从不做任何事情的程序可能有资格作为符合要求的实现(具有适当的文档)。
    • @STingRaySC:我们可以告诉你从未编写过编译器,因为你从语言定义的角度来看条件构造,而不是它对编译器来解析、表示和翻译。从来没有写过编译器并没有错,但是如果你写过(即使是一个小编译器)你会更好地理解这里的讨论。
    【解决方案3】:

    C 指定实现必须能够翻译包含多个限制中的每一个的实例的程序。第一个限制是 127 个嵌套级别的块。 (ISO/IEC 9899:1999 的 5.2.4.1)

    C 并没有说任何包含不超过 127 个嵌套级别的有效程序都必须被翻译。它在其他方面可能大得不合理。其基本原理是设定可移植程序可以具有的某种程度的期望,同时允许不排除小型实现和针对小型系统的实现。

    简而言之,如果您想要超过 127 个嵌套级别,这可能意味着您应该查阅实现的文档以查看它是否保证支持更大的数量。

    【讨论】:

    • 对于任何实际编写的代码达到 127 级嵌套的开发人员,我都会遇到一系列问题。
    【解决方案4】:

    只是把整个范围界定的事情放在床上,以下是合法的 C++ 代码:

    int main() {
        if ( int x = 1 ) {
        }
        else if ( int x = 2 ) {
        }
    }
    

    如果 if 和 else if 都在同一范围内,则不会。我认为有很多误解,可能是我的评论引起的:

    The compiler cares a great deal about scope. 
    

    这当然是正确的,但在这种情况下可能没有帮助。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多