2010-11-02 16 views
5

Bildirir ve asla değişken kullanmazsam gcc bana bir uyarı verecektir.Yapı içinde kullanılmayan üyeler nasıl denetlenir?

Ama bazı üyeleri ile yapı ve varsa, gcc bu konuda uyarmak olmaz kullanılmayan bazı olanların ...

bir seçenek (veya başka bir yöntemi), bu kontrol etmek var mıdır?

(Elbette bazı girişleri el ile silebilir ve yeniden derlemeye çalışabilirim, ancak bu tür bir yaklaşım arıyorum).

Teşekkürler

+0

Peki ya 'grep'? –

+0

Evet, üye adı için grepping yapmanızı öneririm ve bir kereden fazla gelip gelmediğini görmek isterdim. –

+0

Evet komutunu verebilmeliydiniz, fakat lütfen cevabımı görün. –

cevap

5

GCC bunu bildirmeyecektir. Çoğunlukla, çoğunluk durumunda, bir üyenin kullanılıp kullanılmadığı belirlenemez. struct'un iyi bir kısmı bir başlık dosyasında tanımlanmıştır. Bu sadece uygulamanızla değil, aynı zamanda .lib dosyasına başvuruda bulunan veya aynı başlık dosyasını kullanan başka bir uygulama tarafından da kullanılabilir. Bu nedenle, derlenen mevcut kod parçası üyenin kullanılmadığı için üyenin başka bir kod parçası tarafından kullanılmadığı anlamına gelmez.

Yerel değişkenler farklıdır. Yalnızca söz konusu işlevin derlenmesiyle kolayca kullanılıp kullanılmayacakları belirlenir. Bu nedenle, GCC ve diğer birçok derleyici, bir uyarı verir.

+1

Yapı, dolgu ve hizalama için de üyeye sahip olabilir; muhtemelen GCC'nin bunlarla ilgili uyarmasını istemiyorsunuz. –

3

Yasal olarak ve portably basitçe ilk üye tipine yapı kopartarak, adını kullanmadan bir yapının ilk üyesini erişebilirler. Sen olmayan portably da yapabilirsiniz, ancak hemen hemen% 100 güvenilirliği ile, uyumlu bir yapıya sahip başka bir yapı tipine yapı dökerek adını kullanmadan yapı içinde herhangi bir alanı erişmek

typedef struct { 
    int x; 
} mystruct; 

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

.

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

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

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

Bu ne alanın adı için kaynak arıyor, ne çıkarmadan demektir korkuyorum, tamamen güvenilirdir.

+1

Ayrıca, ikinci örneğiniz gibi yasal ve portatif bir şekilde yapmanıza izin veren 'offsetof() 'makrosunu da kullanabilirsiniz. –

+0

Bu oldukça doğru, ancak kaynak kodu ararken en azından bunu bulabilirsiniz. –

+0

+1 İyi bir bakış açısı. –

İlgili konular