2010-11-02 9 views
5

Se dichiaro e non uso mai la variabile, gcc mi avviserà.Come verificare i membri non utilizzati in struct?

Ma se ho una struct con parecchi membri e alcuni di quelli che non vengono utilizzati, gcc non avvisa su di esso ...

C'è un'opzione (o un altro metodo) per controllare questi?

(Naturalmente posso cancellare manualmente alcune voci e provare a compilare di nuovo, ma sto cercando questo tipo di approccio).

Grazie

+0

Che dire di 'grep'? –

+0

Sì, mi sento di raccomandare grepping per il nome del membro e vedere se viene fuori più di una volta. Dovresti essere in grado di codificare quello –

+0

Sì, ma per favore vedi la mia risposta. –

risposta

5

No GCC non mettere in guardia su questo. Principalmente perché nella maggioranza dei casi non è possibile determinare se un membro viene utilizzato o meno. Una buona porzione di struct è definita in un file di intestazione. Questo può essere usato non solo dalla tua applicazione ma da qualsiasi altra applicazione che faccia riferimento al tuo .lib o che usi lo stesso file di intestazione. Quindi, solo perché l'attuale pezzo di codice che viene compilato non usa il membro, non significa che il membro non sia usato da qualche altro pezzo di codice.

Le variabili locali sono diverse. Indipendentemente dal fatto che vengano utilizzati o meno, è possibile determinarli semplicemente compilando solo la funzione in questione. Quindi GCC, e molti altri compilatori, danno un avvertimento.

+1

La struttura potrebbe anche avere membri in essa per riempimento e allineamento; probabilmente non vuoi avvertimenti GCC su questi. –

3

È possibile accedere legalmente e facilmente al primo membro di una struct senza utilizzare il nome, semplicemente lanciando la struct sul tipo del primo membro.

typedef struct { 
    int x; 
} mystruct; 

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

È anche possibile non portabile, ma praticamente 100% di affidabilità, accedere a qualsiasi campo nella struct senza utilizzare il suo nome per colata struct un altro tipo struct con una struttura compatibile.

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

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

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

Ho paura che questo significa che né la ricerca della fonte per il nome del campo, nè la rimozione, sono completamente affidabili.

+1

Puoi anche usare la macro standard 'offsetof()', che ti permetterà di fare qualcosa come il tuo secondo esempio legalmente e portabilmente. –

+0

Questo è abbastanza corretto, anche se lo troverete almeno quando avete cercato il codice sorgente. –

+0

+1 È un buon punto di vista. –

Problemi correlati