2010-11-02 15 views
5

Si declaro y nunca uso una variable, entonces gcc me dará una advertencia.¿Cómo verificar si hay miembros no utilizados en struct?

Pero si tengo una estructura con varios miembros y algunos de ellos no están acostumbrados, gcc no le advertirá de ello ...

¿Hay una opción (u otro método) para comprobar estos?

(Por supuesto, puedo eliminar manualmente algunas entradas e intentar compilar de nuevo, pero estoy buscando este tipo de enfoque).

Gracias

+0

¿Qué pasa con 'grep'? –

+0

Sí, recomiendo grepping para el nombre del miembro y ver si aparece más de una vez. Debería poder guiar ese –

+0

Sí, pero por favor vea mi respuesta. –

Respuesta

5

No GCC no advertirá sobre esto. Principalmente porque en la mayoría de los casos no se puede determinar si un miembro es utilizado o no. Una buena porción de struct se define en un archivo de encabezado. Esto puede ser utilizado no solo por su aplicación sino por cualquier otra aplicación que haga referencia a su .lib o que use el mismo archivo de encabezado. Por lo tanto, solo porque la pieza actual de código que se está compilando no use el miembro, no significa que el miembro no sea utilizado por ningún otro código.

Las variables locales son diferentes. Si se usan o no fácilmente, se determina compilando solo la función en cuestión. Por lo tanto, GCC y muchos otros compiladores dan una advertencia.

+1

La estructura también puede tener miembros para relleno y alineación; probablemente no quieras que GCC advierta sobre esto. –

3

Puede acceder de forma legal y portátil al primer miembro de una estructura sin usar su nombre, simplemente al convertir la estructura al tipo del primer miembro.

typedef struct { 
    int x; 
} mystruct; 

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

También puede no portable, pero con prácticamente el 100% de fiabilidad, tener acceso a cualquier campo de la estructura sin necesidad de utilizar su nombre por fundición de la estructura a otro tipo de estructura con una estructura compatible.

typedef struct { 
    int x; 
    char y; 
} mystruct; 

typedef struct { 
    int a; 
    char b; 
} otherstruct; 

mystruct s; 
((otherstruct*)&s)->b = 'C'; 

Me temo que esto significa que ni la búsqueda de la fuente para el nombre del campo, ni su eliminación, son completamente fiables.

+1

También puede usar la macro estándar 'offsetof()', que le permitirá hacer algo como su segundo ejemplo legalmente y de manera portátil. –

+0

Eso es bastante correcto, aunque al menos lo encontrarías cuando busques el código fuente. –

+0

+1 Es un buen punto de vista. –

Cuestiones relacionadas