3

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

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

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

这是我认为可能有一些限制的事情的列表:

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

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

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

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

4 回答 4

11

Visual C++ 编译器限制

C++ 标准建议对各种语言结构进行限制。以下是 Visual C++ 编译器未实现建议限制的构造列表。第一个数字是推荐的限制,第二个数字是 Visual C++ 实现的限制:

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

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

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

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

  • 单个 struct-declaration-list [256] (16) 中的嵌套类、结构或联合定义的级别。

  • 构造函数定义中的成员初始值设定项 [6144](大约 600 个,取决于内存,可以使用 /Zm 编译器选项增加)。

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

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

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

于 2010-01-22T18:25:28.080 回答
6

语言标准是否说明了这些限制(可能是实现的最低要求)?

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

编辑:该标准在附件 B 中建议了一些最低限度 - 这里确实有太多要发布的内容,无论如何它们都是建议性的:

这些限制可能会限制包括以下描述的数量或其他数量。建议将每个数量后面的括号中的数字作为该数量的最小值。但是,这些数量仅作为指导,并不能确定合规性。

于 2010-01-22T17:44:42.223 回答
3

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

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

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

The compiler cares a great deal about scope. 

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

于 2010-01-22T18:39:21.287 回答
3

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

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

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

于 2010-01-22T18:04:15.820 回答