C 如何检查结构中未使用的成员?

C 如何检查结构中未使用的成员?,c,struct,gcc-warning,C,Struct,Gcc Warning,若我声明并且从不使用变量,那个么gcc会给我一个警告 但是如果我有一个包含多个成员的结构,并且其中一些成员没有被使用,gcc将不会对此发出警告 是否有选项(或其他方法)来检查这些 (当然,我可以手动删除一些条目并尝试再次编译,但我正在寻找这种方法) 谢谢没有GCC不会对此发出警告。主要是因为在大多数情况下,无法确定是否使用了成员。struct的大部分在头文件中定义。这不仅可以由您的应用程序使用,还可以由引用您的.lib或使用相同头文件的任何其他应用程序使用。因此,仅仅因为当前正在编译的代码没有使

若我声明并且从不使用变量,那个么gcc会给我一个警告

但是如果我有一个包含多个成员的结构,并且其中一些成员没有被使用,gcc将不会对此发出警告

是否有选项(或其他方法)来检查这些

(当然,我可以手动删除一些条目并尝试再次编译,但我正在寻找这种方法)


谢谢

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


局部变量是不同的。它们是否易于使用,只需编译相关函数即可确定。因此,GCC和许多其他编译器都会发出警告。

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

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';

我担心这意味着在源代码中搜索或删除字段名都不完全可靠。

结构中也可能包含用于填充和对齐的成员;你可能不想听到GCC关于这些的警告。是的,我建议对成员名称进行grepping,看看它是否出现了不止一次。您应该能够编写脚本是的,但请查看我的答案。您还可以使用标准的
offsetof()
宏,这将允许您合法且可移植地执行类似于第二个示例的操作。这是非常正确的,尽管您至少在搜索源代码时会发现这一点。