2010-11-02 71 views
5

如果我声明并且从不使用变量,那么gcc会给我一个警告。如何检查struct中未使用的成员?

但是,如果我有几个成员结构和一些人不习惯,GCC不会发出警告它的...

是否有一个选项(或其他方式),以检查这些? (当然,我可以手动删除一些条目,并尝试再次编译,但我正在寻找这种方法)。

谢谢

+0

'grep'呢? – 2010-11-02 16:32:49

+0

是的,我建议您注意会员名称并查看它是否出现过一次以上。你应该能够编写脚本 – 2010-11-02 16:45:11

+0

是的,但请看我的答案。 – 2010-11-02 16:54:02

回答

5

没有GCC不会警告这一点。主要是因为在大多数情况下,无论是否使用会员都无法确定。头文件中定义了很好的struct部分。这不仅可以用于您的应用程序,也可以用于任何引用.lib或使用相同头文件的其他应用程序。因此,仅仅因为当前编译的代码片段不使用成员,并不意味着该成员没有被其他代码片段使用。

局部变量是不同的。无论是否仅通过编译相关函数来确定它们是否易于使用。因此GCC和许多其他编译器发出警告。

+1

该结构中可能还有成员用于填充和对齐;你可能不希望GCC警告这些。 – 2010-11-02 16:44:52

3

只需将结构体转换为第一个成员的类型,就可以合法且可移植地访问结构体的第一个成员而不使用其名称。

typedef struct { 
    int x; 
} mystruct; 

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

你也可以不便携,但是几乎100%的可靠性,访问结构的任何领域,而不通过与兼容的结构,铸造结构,以另一种结构类型,使用其名称。

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

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

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

恐怕这意味着既不搜索源字段的名称也不删除它是完全可靠的。

+1

您也可以使用标准的'offsetof()'宏,这将允许您在合法和便携的情况下执行类似于第二个示例的操作。 – 2010-11-02 18:10:40

+0

这很正确,尽管当你搜索源代码时你至少会发现这一点。 – 2010-11-02 18:11:56

+0

+1这是一个很好的观点。 – 2013-01-08 13:14:17