2009-09-09 10 views
1

Il est recommandé d'initialiser une variable au moment de la déclaration.Avertissement du compilateur w8004 BDS6 c/C++

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

Dans le mode de débogage, une déclaration comme celle-int vStatus = OK; est à l'origine aucun problème lors de la construction DEBUG MODE.

Le même lorsque la construction en mode release, lance un avertissement en disant:

w8004: « vStatut » est attribué une valeur qui est jamais utilisée.

En outre, je suis en utilisant la même variable plus bas mon code dans la même fonction, comme celui-ci if(!vStatus) et aussi je retourne la valeur de return(vStatus);

Quand je regardais le web pour pointers on this debug Vs Release, compilateurs attendent vous d'initialiser votre variable au moment de la déclarer. J'utilise Borland developer studio 6 avec un serveur Windows 2003. Tous les pointeurs aideront à comprendre ce problème.

Merci

Raj

+0

Il est recommandé de reporter la définition (et non la déclaration, BTW) d'une variable jusqu'à ce que vous ayez quelque chose à initialiser. Voir la réponse de Glen. De cette façon, vous n'avez pas de variable non initialisée et vous n'avez pas besoin d'initialiser les variables avec une valeur fictive pour les redéfinir plus tard. – sbi

+0

La meilleure pratique REAL est de déclarer la valeur au point où vous avez une valeur d'initialisation, et pas plus tôt. Vous déclarez vStatus une ligne au début. En conséquence, vous supposez pour une ligne ce sera "OK". – MSalters

Répondre

3

Vous initialisez vStatut à OK, vous attribuez immédiatement une nouvelle valeur. Au lieu de cela, vous devriez initialiser vStatus avec une valeur que vous allez utiliser.

Essayez de faire ce qui suit à la place:

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

Edit: Quelques précisions.

L'initialisation d'une variable, uniquement pour ne jamais utiliser cette valeur, puis pour affecter une autre valeur à la variable est inefficace. Dans votre cas, lorsque vous n'utilisez que des int, ce n'est pas vraiment un problème. Cependant, s'il y a une grosse surcharge dans la création/copie/affectation pour vos types, alors les frais généraux peuvent être une perte de performance, surtout si vous le faites beaucoup.

Fondamentalement, le compilateur essaie de vous aider et indiquer les domaines dans votre programme où des améliorations peuvent être apportées à votre code

+0

Merci pour votre commentaire. Mais pourquoi cela nécessite un avertissement. La raison pour laquelle je déclare et initialise au début est parce que, je sais quelle valeur j'ai assignée à ma variable de statut. – Raj

+0

Sbi et Msalters ont expliqué la réponse à ma question dans le moment où j'ai posté le commentaire ci-dessus.Merci – Raj

+0

Les avertissements ne sont pas obligatoires. Au lieu de cela, ce sont des choses que les rédacteurs du compilateur pensent être bonnes à porter à votre attention. Généralement, ils sont bons à suivre car ils incluent des choses comme "vous avez oublié une déclaration de retour dans cette fonction" ou "la variable x dans la fonction foo() masque la variable x dans la fonction principale". –

0

Si vous vous demandez pourquoi il n'y a pas d'avertissement en mode débogage, il est parce que les laissez-passer qui effectuent l'analyse de flux de données (qui est ce qui trouve le problème) ne sont exécutés que dans le cadre de l'optimisation.

Questions connexes