2010-11-02 5 views
5

Si je déclare et n'utilise jamais de variable, gcc me donnera un avertissement.Comment vérifier les membres inutilisés dans struct?

Mais si j'ai un struct avec plusieurs membres et certains de ceux ne sont pas utilisés, gcc ne mettre en garde à ce sujet ...

Y at-il une option (ou une autre méthode) pour vérifier ces?

(Bien sûr, je peux supprimer manuellement certaines entrées et essayer de compiler à nouveau, mais je cherche ce genre d'approche).

Merci

+0

Qu'en est-il de 'grep'? –

+0

Oui, je recommanderais grepping pour le nom du membre et voir si elle se lève plus d'une fois. Vous devriez pouvoir écrire ce –

+0

Oui, mais s'il vous plaît voir ma réponse. –

Répondre

5

Aucun GCC ne le préviendra. Surtout parce que dans la majorité des cas, l'utilisation ou non d'un membre ne peut être déterminée. Une bonne partie de struct est définie dans un fichier d'en-tête. Cela peut être utilisé non seulement par votre application mais par toute autre application référençant votre fichier .lib ou utilisant le même fichier d'en-tête. Donc, juste parce que le morceau de code en cours de compilation n'utilise pas le membre, cela ne signifie pas que le membre n'est pas utilisé par un autre morceau de code.

Les variables locales sont différentes. Qu'ils soient ou non utilisés facilement en ne compilant que la fonction en question. D'où GCC, et beaucoup d'autres compilateurs, donnent un avertissement.

+1

La structure peut également avoir des membres pour le remplissage et l'alignement; vous ne voulez probablement pas d'avertissement de GCC à ce sujet. –

3

Vous pouvez accéder légalement et de façon portable au premier membre d'une structure sans utiliser son nom, simplement en transtypant la structure dans le type du premier membre.

typedef struct { 
    int x; 
} mystruct; 

mystruct s; 
*(int*)&s = 3; 

Vous pouvez également non portably, mais avec pratiquement 100% de fiabilité, accéder à un champ dans la struct sans utiliser son nom en jetant le struct à un autre type de structure avec une structure compatible. J'ai peur que cela signifie que ni la recherche de la source pour le nom du champ, ni sa suppression, ne sont complètement fiables.

+1

Vous pouvez également utiliser la macro 'offsetof()' standard, qui vous permettra de faire quelque chose comme votre deuxième exemple légalement et de façon portative. –

+0

C'est tout à fait correct, bien que vous le trouviez au moins lorsque vous avez recherché le code source. –

+0

+1 C'est un bon point de vue. –