2009-09-09 144 views
1

这是在声明时初始化变量的最佳做法。w8004编译器警告BDS6 c/C++

int TMyClass::GetValue() 
{ 
    int vStatus = OK; 
    // A function returns a value 
    vStatus = DoSomeThingAndReturnErrorCode(); 
    if(!vStatus) 
     //Do something 
    else 
     return(vStatus); 
} 

在调试模式,这样int vStatus = OK;一个语句引起调试模式的构建过程中没有问题。

同样,当构建以发布模式,抛出一个警告说:

w8004:“VSTATUS”被分配一个是从未使用过的值。

而且,我在同样的功能进一步使用相同的变量了我的代码,这样if(!vStatus),也是我回报的return(vStatus);

值当我看着网页的pointers on this debug Vs Release,编译器期望你在声明它的时候初始化你的变量。

我正在使用Borland开发人员工作室6与Windows 2003服务器。

任何指针都会帮助我理解这个问题。

感谢

拉吉

+0

推迟变量的定义(不是声明,BTW)是最好的实践,直到你有一些东西要初始化为止。看Glen的回答。这样你就没有未初始化的变量,并且你不需要用一些虚拟值来初始化变量,以便稍后重写它们。 – sbi 2009-09-09 13:42:49

+0

REAL最佳实践是在具有初始化值的位置声明值,而不是在更早的位置。你早先宣布vStatus一行。因此,你假设一行将是“OK”。 – MSalters 2009-09-09 13:43:02

回答

3

您初始化VSTATUS就OK了,然后立即指派一个新值。

而不是这样做,你应该用你将要使用的值赋值vStatus。

尝试做,而不是执行以下操作:

int TMyClass::GetValue() 
{ 
    // A function returns a value 
    int vStatus = DoSomeThingAndReturnErrorCode(); 
    if(!vStatus) 
     //Do something 
    else 
     return(vStatus); 
} 

编辑:一些澄清。

初始化一个变量,只是从不使用该值,然后向变量赋值另一个值是效率低下的。在你的情况下,你只是使用int的地方,这不是一个真正的问题。但是,如果在为类型创建/复制/分配时存在大量开销,那么开销可能会导致性能下降,尤其是如果你做了很多。

基本上,编译器正试图帮助你和你的节目里改进可以在你的代码

+0

感谢您的评论。但为什么这需要警告。我在开始声明和初始化的原因是,我知道我的状态变量赋予了什么值。 – Raj 2009-09-09 13:44:01

+0

Sbi和Msalters在我发布上述评论时解释了我的问题的答案。谢谢 – Raj 2009-09-09 13:45:39

+0

警告不是强制性的。相反,它们是编译器作者认为很适合引起您注意的事情。一般来说,它们很好,因为它们会包含诸如“你忘记了函数中的返回语句”或“函数foo()中的变量x隐藏了主函数中的变量x”。 – 2009-09-09 16:57:46

0

如果你想知道为什么有一个在调试模式没有警告做出指出的领域,这是因为通行证执行数据流分析(这是发现问题的那些)仅作为优化的一部分运行。