代码之家  ›  专栏  ›  技术社区  ›  jay.lee

关于范围的变量最优声明

  •  8
  • jay.lee  · 技术社区  · 14 年前

    我问这个问题主要是关于C编程的,但是对任何语言的见解都是受欢迎的。

    说到C,我知道它只允许变量声明出现在代码块的最开始。我的印象是,一个人应该在函数的开头声明所有要在函数中使用的变量。但在很多情况下,我会有一个只在循环(或类似块)中使用的变量。

    例如,某些返回值的临时变量:

    while ( whatever ) {
      int ret;
      ret = getSomeValue();
    }
    

    或者在需要持有某一州的情况下:

    while ( whatever ) {
      static int count=0;
      count++;
    }
    

    我想知道这是否被认为是不合适的,或者是否对在控制流块中声明变量有任何负面影响,比如if else、for loops、while loops等。

    变量应该总是用尽可能小的范围声明吗?静态声明呢?

    编辑 以下内容: 好吧,我可能应该说,我知道C99在声明变量方面更为自由,但从我看到的许多C代码来看,它们通常还是在顶部声明的。另外,我使用的vs2k8仍然抱怨声明。

    另外,鉴于我有2票赞成关闭这个thead,我会明确表示,我更关心性能和编译器方面,而不是任何风格。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Paul    14 年前

    经验法则是变量应该尽可能的局部化。如果你能做到的话,可以加分 const 是的。

        2
  •  5
  •   DigitalRoss    14 年前

    好的,关于块顶部的声明是c89和k&r,但是由于c99,您可以混合声明和语句。这种风格持续存在,可能是有充分理由的,但不是必需的。

    有一段时间,如果您在使用本地变量的地方声明了很多本地变量,那么一些编译器会做得更好,因为这会使寄存器分配更好。在C99之前,您必须在块的顶部声明它们,或者使用供应商扩展,但是您仍然可以决定实际上 使用 每个变量只在代码的局部区域中。

    在一个点上,用更灵活的声明来支持这一点可能是很重要的,但我怀疑现在的优化器不需要这种帮助。

    有些编码标准要求在函数顶部声明。我不知道这样做是为了让你能找到它们,还是只是因为那些不这样做可能会限制向后可移植性的日子留下的。

    一般来说,标准越正式,它就越不喜欢交错语句和声明,除了循环控制变量。就我个人而言,我不认为有什么问题。

    混合声明的优点 :地点。对编译器好,对读者好。在函数顶部声明循环变量可能带来什么好处?为了一个不相关的目的在页面下面重用一个变量,对于可能不需要的交互来说,这看起来既混乱又不明智。

    分组声明的优点 :代码在主观上看起来更干净,您知道在哪里可以找到每个声明,如果您的函数的顶部离变量的使用太远,也许这就告诉您需要从明显太大的函数中提取第二个或第三个函数。

        3
  •  2
  •   Alexander Rafferty    14 年前

    其中声明变量不会影响代码生成。所有的函数变量在第一行代码执行之前放在堆栈上(至少这是观察到的行为)。正如您已经知道的,关于变量声明的规则早已过时。在顶部声明变量有以下优点

    • 当所有变量都可以在同一个地方找到时,更容易阅读
    • 如果需要在声明变量之前突然访问该变量,则不必担心重新排列代码(当然,除非您有意阻止这种情况)。

    是的,我会让变量尽可能的局部化。如果一个变量只在一个循环或控制流中使用,甚至是一个无意义的{}对(我用它来防止名称冲突),那么在那里声明它们。把著名的n或i变量带入for循环。如果有多个,则每个for循环都需要一个唯一的var名称,这将变得烦人。