如何让 gcc 警告未定义的结构?

How to make gcc warn undefined struct?

我在 .h 中定义了一个结构

struct buf_stats {
   // ***
};

然后在.c文件中

struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;

其中 buf_states 是错字。

但是 gcc 没有警告我,尽管我使用了 -Wall

而这个 bug/typo 花了我 3 个小时才找到答案。

如何让 gcc 像这样警告未定义的结构?

在你的代码中

  struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;

错误的原因有很多,比如

  • 您正在使用未定义的类型(如您所述)
  • 您正在分配更少的内存(分配给 类型指针 而不是 类型

但是对于这种特殊类型的错误,您的编译器在 _this_case 中无能为力,因为

  • 平台中指向 (any) 类型的指针具有定义的大小,因为结构(即它指向的变量的类型to) 不必是完整的 (defined)。这就是我们可以拥有自引用结构的原因,对吗?

  • malloc() 不知道目标变量类型。它只是读取所需大小的参数,return 指向已分配内存的指针(类型为 void *),并在分配时更改为目标类型。它不可能计算目标大小(类型)与分配的内存大小的不匹配

避免这类错误最方便最简单的方法是,不要直接使用硬编码类型作为sizeof的操作数,而是使用变量引用。

类似

 struct buf_stats *bs = malloc(sizeof *bs) ; // you can write that as (sizeof (*bs)) also
                                             // sizeof *bs === sizeof (struct buf_stats)

相当于

 struct buf_stats *bs = malloc(sizeof(struct buf_stats)) ;

但更稳健且不易出错。

备注:

  1. 如果操作数不是类型名称,则不需要括号。
  2. 该语句在改变目标变量类型时不需要任何修改bs

你不能。使用像 struct foo *(指向某些结构类型的指针)这样的表达式 声明 结构为 不完整类型 。大小未知,但对于 指针 .

的大小来说不是必需的

就是说,代码看起来不对,因为您需要结构的 大小 而不是 指针的大小),所以使用以下代码:

struct buf_stats *bs = malloc(sizeof(struct buf_states));

你会得到一个错误

写这样的代码有更好的方法:

struct buf_stats *bs = malloc(sizeof *bs);

表达式 *bs 具有 sizeof 的正确类型,即使您稍后更改类型也是如此。