2010-03-05 6 views
6

J'ai une section de code qui peut être résumée comme suit;Pourquoi le code suivant ne génère pas d'avertissement dans MSVC

void MyFunc() 
{ 
    int x; 
' 
' 
    x; 
' 
' 
} 

j'aurais pensé que le référencement simplement une variable, sans le modifier de toute façon ou d'utiliser de toute façon sa valeur devrait générer un avertissement. Dans VS2003, il ne fait ni l'un ni l'autre, et j'ai besoin de charpie pour le ramasser.

Je me rends compte que cela n'affecte pas l'exécution, mais comme c'est un morceau de code qui ne fait rien, et que le programmeur voulait sans doute faire quelque chose, pourquoi n'est-il pas marqué?

De même, attendez-vous que x = x soit un avertissement?

Modifier: La question a été modifiée, car cela constitue un bon candidat pour un avertissement, mais n'est pas une erreur. Les réponses suggèrent que cela est mieux géré avec d'autres compilateurs. Essayera VS2008 plus tard et afficher le résultat.

+0

pourquoi cela donnerait-il une erreur, la syntaxe est correcte. – Grumpy

+0

Peut-être pas une erreur, mais certainement un avertissement. if (x = y) est syntaxiquement correct, mais généralement pas ce que le programmeur voulait.Je dirais que tout code qui n'est probablement pas ce que le programmeur a prévu devrait générer un avertissement, et je ne vois pas comment ajouter une instruction au code qui ne fait pas l'intention de la plupart des programmeurs la plupart du temps. –

Répondre

1

Vous devez utiliser un meilleur compilateur :-) Compilé avec les drapeaux et -Wall -pedantic, le compilateur GCC C donné ce code:

int main() { 
    int x = 0; 
    x; 
} 

produit ce diagnostic:

ma.cpp:3: warning: statement has no effect 
+0

PC-Lint fait la même chose pour moi, juste très lentement;) erreur 522: (Attention - Type de vide attendu, affectation, incrément ou décrément) Surprenant combien de ceux-ci je rencontre traversant une grande base de code, toutes les erreurs dans ce cas. –

+1

@Shane Si la PC-Lint est trop lente, vous pouvez rechercher GCC. Le port MinGW (obtenir la version sur http://tdragon.net/recentgcc) compilera heureusement le code Windows. –

1

Un tel code peut apparaître dans une classe de modèle à des fins de métaprogrammation. Par exemple, il peut s'agir d'une sorte de vérification si x est accessible à partir du contexte actuel. Oui, il n'affecte pas le résultat de exécution, mais il affecte le résultat de compilation; Cela pourrait aider à des techniques comme SFINAE.

Il semble que cela ne soit d'aucune utilité pour la compilation. Les corps de corps ne comptent pas pour choisir le gabarit approprié pour un appel de fonction. Et pour vérifier l'accessibilité dans une portée de classe, vous devez utiliser l'opérateur using pour les noms dépendants; cet opérateur using étant lui-même un contrôle d'accessibilité. Par conséquent, le code x; n'a vraiment aucun effet.

+0

@Pavel Shved, je ne vois pas votre point. Si 'x' n'est pas accessible depuis le contexte actuel dans une instanciation de template, il en résulte une erreur de compilation n'est-ce pas? Qui bat SFINAE. –

+0

+1 pour l'édition et les conclusions. –

1

Vous attendez un avertissement à moins que vous lancez l'expression d'annuler, à savoir

void MyFunc() 
{ 
    int x; 

    (void)x; 

} 

Quel niveau d'alerte Avez-vous mis?

+0

/W4, le plus haut niveau dans VS2003, yup je m'attendrais à un avertissement. (Comme il passe un matin trwaling à travers la production de charpie). –

+0

'gcc -Wall' donne:' lint.c: 5: avertissement: instruction sans effet' –

+0

Le CCI d'Intel donne: 'lint.c (5): remarque # 174: l'expression n'a aucun effet' et' lint.c (5): avertissement # 592: variable "x" est utilisé avant que sa valeur est définie' –

0

deux simples variables déclarations (telles que x,) et l'auto-affectation (comme x = x) sont un code valide en C++, de sorte que le compilateur ne peut pas les marquer comme des erreurs, mais un bon le compilateur est bien sûr autorisé à donner un avertissement qu'il n'a aucun effet, et peut être une erreur du programmeur. Par exemple, le compilateur g ++ donne l'avertissement "l'instruction n'a aucun effet" pour x;.