2010-11-01 6 views
6

J'utilise g ++ 4.3.0 pour compiler cet exemple:Une variable non détectée Inutilisable

#include <vector> 

int main() 
{ 
    std::vector<int> a; 
    int b; 
} 

Si je compile l'exemple avec le niveau d'alerte maximal, je reçois un avertissement que la variable b est non utilisé:

[[email protected] data_create]$ g++ m.cpp -Wall -Wextra -ansi -pedantic 
m.cpp: In function ‘int main()’: 
m.cpp:7: warning: unused variable ‘b’ 
[[email protected] data_create]$ 

la question est: pourquoi la variable un n'est pas signalé comme non utilisé? Quels paramètres dois-je passer pour obtenir l'avertissement pour la variable a?

+0

Certains avertissements d'analyse de code GCC ne fonctionnent que (ou fonctionnent mieux) si vous utilisez également l'optimisation, essayez avec -O2 ou -O3 –

+0

@Laurynas Biveinis Je pense que les réponses sont correctes. Le niveau d'optimisation ne joue aucun rôle dans ce cas (pour être sûr d'avoir essayé). –

Répondre

23

En théorie, le constructeur par défaut pour std::vector<int> peut avoir des effets secondaires arbitraires, de sorte que le compilateur ne peut pas déterminer si la suppression de la définition de a modifierait la sémantique du programme. Vous obtenez uniquement ces avertissements pour les types intégrés.

Un meilleur exemple est un verrou:

{ 
    lock a; 
    // ... 
    // do critical stuff 
    // a is never used here 
    // ... 
    // lock is automatically released by a's destructor (RAII) 
} 

Même si a est jamais utilisé après sa définition, la suppression de la première ligne serait une erreur.

+0

Excellente réponse/exemple. J'ai utilisé un exemple similaire il y a un certain temps quand j'expliquais le même concept à un client. Le client m'a combattu bec et ongles, arguant que "lock a" serait optimisé car il "n'était pas utilisé". J'ai expliqué qu'il était garanti de ne pas être éliminé (effets secondaires de constructor/destructor - mutex acquisition/release). Si je me souviens, j'ai finalement dû trouver des chapitres et versets dans la norme qui a soutenu mon point. Je vais essayer de trouver et de poster. – Dan

1

a n'est pas un type intégré. Vous appelez en fait le constructeur de std::vector<int> et en affectant le résultat à un. Le compilateur voit cela comme une utilisation car le constructeur pourrait avoir des effets secondaires.

1

a est effectivement utilisé après sa déclaration car son destructeur est appelé à la fin de sa portée.

Questions connexes