【问题标题】:How to check for unused members in struct?如何检查结构中未使用的成员?
【发布时间】:2010-11-02 16:31:11
【问题描述】:

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

但是如果我有一个包含多个成员的结构并且其中一些没有使用,gcc 不会警告它...

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

(当然我可以手动删除一些条目,然后重新编译,但我正在寻找这种方法)。

谢谢

【问题讨论】:

  • 是的,我建议使用 grepping 获取成员名称并查看它是否不止一次出现。您应该能够编写脚本
  • 是的,但是请看我的回答。

标签: c struct gcc-warning


【解决方案1】:

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

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

【讨论】:

  • 该结构中可能还有用于填充和对齐的成员;您可能不希望 GCC 对这些发出警告。
【解决方案2】:

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

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

恐怕这意味着无论是从源中搜索字段名称,还是将其删除,都不完全可靠。

【讨论】:

  • 您也可以使用标准的offsetof() 宏,这将允许您合法且可移植地执行第二个示例。
  • 说的很对,虽然你至少可以在搜索源代码的时候找到这个。
猜你喜欢
  • 2021-03-08
  • 2019-04-15
  • 2017-06-16
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多