2010-07-06 46 views
4

只要与同事在工作中交谈如何声明一个变量。 对我来说,我已经决定了我喜欢哪种风格,但也许我错了。函数和声明一个局部变量

“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++相同。这也不是一种真正的风格,而是一种语言要求。 – 2010-07-06 19:50:59

+4

“C”风格也是尽可能在本地声明变量。 C89要求它们在块的开头(不一定是函数的开始); C99和C++允许声明它们的初始化位置。 – 2010-07-06 19:53:55

+0

@Pavel感谢您指出 – dimba 2010-07-06 19:56:40

回答

1

这可能有点主观。

我更喜欢尽可能地本地化,因为它使得它完全清楚变量的范围是什么,如果您在预期的有用范围之外访问它,编译器会产生错误。

4

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

如果你有一个选择,那么声明它们在哪里使用的变量会更有意义。我使用的经验法则是:声明所需的最小范围的变量。

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

3

我更喜欢“C++风格”。主要是因为它允许RAII,你在这两个例子中都是为bool变量做的。此外,如果变量的范围很窄,则可以为编译提供更好的oppertunities来进行优化。

+1

+1参考RAII – dkackman 2010-07-06 20:26:21

12

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

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

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

虽然我确实坚持没有样式严格:只有关键变量放在那里,大多数小变量都存在于块在哪里需要它们(例如在您的示例中为bool rc)。

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

+0

函数的主要变量是您必须在开始时正确初始化的变量。 我正确吗? – 2010-07-06 20:09:49

+2

@ Dummy00001:很容易找到变量。他们紧挨着他们需要/使用的地方。你不需要寻找它们。 – Puppy 2010-07-06 20:17:51

+0

当我需要找到变量的声明时,我只需按住Ctrl并单击它的名称即可。它适用于所有编码习惯,包括使用一些疯狂的模板元编程和Boost。你只需要使用正确的IDE;) – 2010-07-07 00:24:53

0

这不是一个样式问题。在C++中,非POD类型将在构造函数的末尾调用声明和析构函数时调用它们的构造函数。你必须明智地选择在哪里声明变量,否则会导致不必要的性能问题。例如,在一个循环中声明一个类变量可能不是最明智的想法,因为循环的每次迭代都会调用构造函数/析构函数。但有时候,如果变量根本没有被使用(比如一个变量只用在'if'语句中),那么在函数顶部声明类变量可能不是最好的。

+0

问题主要针对POD变量。我会更新这个问题 – dimba 2010-07-06 20:22:05

相关问题