函数和声明局部变量

6

我正在与同事讨论如何声明变量的问题,这与IT技术有关。对我而言,我已经决定了我喜欢的风格,但也许我是错的。

"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变量。


2
你例子中的“C风格”实际上是“C89风格”,因为C99允许在块的中间声明变量,就像C++一样。它也不是真正的风格,而是语言要求。 - Pavel Minaev
5
“C”风格也意味着尽可能在本地声明变量。C89要求它们位于块的开头(不一定是函数的开头);C99和C++允许在初始化时声明它们。 - Mike Seymour
3
在 C++ 中,这不仅是样式问题。如果类型不支持默认构造函数,那么可能无法使用您所谓的“C风格”。如果类型支持默认构造函数,并且默认构造函数执行了很多工作,那么可能效率会降低。 - Mike Seymour
你的"C++"风格示例在任何情况下都是有效的C代码(假设定义了bool),因此这是一个错误的选择。在"C"示例中,你甚至已经在while块中声明了rc,所以你已经知道了吧? - Clifford
@Clifford Upps,将“rc”声明以C语言风格移至函数开头。 - dimba
1
@idimba:但事实仍然是,这两个例子在C89中都是有效的。 - Clifford
6个回答

14

第二种方式 (C++ 风格)

  1. 这样做能够在代码中应用 YAGNI 原则,您只有在需要变量时才声明它们,并且尽可能靠近其使用位置。这使得代码更容易快速理解,因为您不必来回查看函数以了解所有内容。每个变量的类型是关于该变量的主要信息,并且在变量名称中并不总是明显的。简而言之: 代码更易于阅读
  2. 这可以让编译器进行更好的优化 (如果可能)。请参考:http://www.tantalon.com/pete/cppopt/asyougo.htm#PostponeVariableDeclaration

5

如果您使用的语言要求在函数顶部声明变量,那么您必须明确这样做。

如果您有选择余地,那么最好在使用变量的地方声明变量。我使用的经验法则是:声明具有所需最小范围的变量。

缩小变量的作用域可以防止一些类型的错误,例如您意图仅在循环内部使用的变量被意外地在循环外部使用。缩小变量的作用域将使编译器能够检测到错误,而不是拥有编译但在运行时失败的代码。


4
我更喜欢"C++风格"。主要是因为它允许使用RAII,就像你在两个bool变量的示例中所做的那样。
此外,对变量进行紧密的作用域,为编译器提供了更好的优化机会。

2

这可能有点主观。

我更喜欢尽可能地使用本地变量,因为这可以完全清楚地表明变量的作用域,并且如果您在意图之外访问它,则编译器会生成错误。


0

这不是一个风格问题。在C++中,非POD类型将在声明点调用它们的构造函数,并在作用域结束时调用析构函数。您必须明智地选择变量声明的位置,否则会导致不必要的性能问题。例如,在循环内部声明类变量可能并不是最明智的想法,因为构造函数/析构函数将在每次循环迭代时调用。但有时,在函数的顶部声明类变量可能并不是最好的选择,如果有可能变量根本不被使用(比如变量只在某个“if”语句内部使用)。


这个问题主要是针对POD变量的。我会更新问题。 - dimba

-1

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

虽然我不严格遵守任何一种风格:只有关键变量放在那里,大多数较小的次要变量都在需要它们的块内部(例如您的示例中的bool rc)。

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


函数的主要变量是您必须在最开始初始化的变量。 我说得对吗? - the_drow
2
@Dummy00001:找变量很容易。它们就在需要/使用它们的旁边。你不需要去寻找它们。 - Puppy
当我需要找到变量的声明时,我只需单击其名称即可。它适用于所有编码习惯,包括使用一些疯狂的模板元编程和 Boost。你只需要使用正确的 IDE ;) - Pavel Minaev
@DeadMG:你从未处理过跨越多个屏幕的函数吗?没有保证声明在屏幕上。将声明以某种方式组合在一起的优点是,它们在没有任何鼠标操作的情况下更容易被发现。 - Dummy00001
@the_drow:我会将对函数输出具有直接影响的变量归类为主要变量。这些变量是我在处理函数时一直牢记在心的变量。它们何时/如何初始化对我来说是次要的。 - Dummy00001
@Pavel Minaev:在VIM中使用#/* (+ :set hls!) :D - Dummy00001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接