函数和声明局部变量

时间:2010-07-06 19:48:11

标签: c++ coding-style scope declaration

在工作中与同事交谈如何申报变量。 对我来说,我已经决定了我喜欢哪种风格,但也许我错了。

“C”风格 - 函数开头的所有变量。 如果你想知道变量的数据类型,只需看一下函数的开头。

bool Foo()
{
    PARAM* pParam = NULL;
    bool rc;

    while (true)
    {
       rc = GetParam(pParam);
       ... do something with pParam
    }
}

“C ++”样式 - 将变量声明为尽可能本地。

bool Foo()
{       
    while (true)
    {
        PARAM* pParam = NULL;

        bool rc = GetParam(pParam);
       ... do something with pParam
    }
}

你更喜欢什么?

更新 问题是关于POD变量。

6 个答案:

答案 0 :(得分:13)

第二个。 (C ++风格) 至少有两个很好的理由:

  1. 这个允许您在代码中应用YAGNI原则,因为您只在需要时声明变量,尽可能接近它们的使用。这使代码更容易理解,因为您不必在函数中来回理解它。每个变量的类型是有关变量的主要信息,并且在变量名称中并不总是很明显。简而言之:代码更易于阅读
  2. 允许更好的编译器优化(如果可能)。阅读:http://www.tantalon.com/pete/cppopt/asyougo.htm#PostponeVariableDeclaration

答案 1 :(得分:4)

如果由于您使用的语言,您需要在函数顶部声明变量,那么显然您必须这样做。

如果您有选择,那么将变量声明为使用它们更有意义。我使用的经验法则是:声明具有所需范围最小的变量。

减少变量的范围可以防止某些类型的错误,例如,在意外使用仅用于循环内部的循环之外的变量的情况下。减少变量的范围将允许编译器发现错误,而不是编译但在运行时失败的代码。

答案 2 :(得分:3)

我更喜欢“C ++风格”。主要是因为它允许RAII,你在bool变量的两个例子中都这样做。

此外,对变量进行严格的范围可以为编译提供更好的优化机会。

答案 3 :(得分:1)

这可能有点主观。

我更喜欢本地化,因为它完全清楚了变量的范围,如果您在预期的有用范围之外访问它,编译器会生成错误。

答案 4 :(得分:0)

这不是样式问题。在C ++中,非POD类型将在声明点调用其构造函数,并在作用域末尾调用析构函数。您必须明智地选择声明变量的位置,否则会导致不必要的性能问题。例如,在循环内声明类变量可能不是最明智的想法,因为构造函数/析构函数将在循环的每次迭代中被调用。但有时,如果有可能根本没有使用变量,那么在函数顶部声明类变量可能不是最好的(比如变量仅在某些'if'语句中使用)。

答案 5 :(得分:-1)

我更喜欢C风格,因为C ++风格对我来说有一个主要缺陷:在密集的函数中,很难找到变量的声明/初始化。 (没有语法突出显示能够可靠和可预测地处理我的C ++编码 hazard 习惯。)

虽然我确实严格遵守任何风格:只有关键变量放在那里,大多数微小的变量都存在于需要它们的区块内(例如你的例子中的bool rc)。

但是我的代码中的所有重要关键变量都不可避免地最终被声明为顶部。如果在嵌套块中我有太多的局部变量,那就是我必须开始考虑将代码拆分成更小的函数的标志。