如何让 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)) ;
但更稳健且不易出错。
备注:
- 如果操作数不是类型名称,则不需要括号。
- 该语句在改变目标变量类型时不需要任何修改
bs
。
你不能。使用像 struct foo *
(指向某些结构类型的指针)这样的表达式 声明 结构为 不完整类型 。大小未知,但对于 指针 .
的大小来说不是必需的
就是说,代码看起来不对,因为您需要结构的 大小 ( 而不是 指针的大小),所以使用以下代码:
struct buf_stats *bs = malloc(sizeof(struct buf_states));
你会得到一个错误。
写这样的代码有更好的方法:
struct buf_stats *bs = malloc(sizeof *bs);
表达式 *bs
具有 sizeof
的正确类型,即使您稍后更改类型也是如此。
我在 .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)) ;
但更稳健且不易出错。
备注:
- 如果操作数不是类型名称,则不需要括号。
- 该语句在改变目标变量类型时不需要任何修改
bs
。
你不能。使用像 struct foo *
(指向某些结构类型的指针)这样的表达式 声明 结构为 不完整类型 。大小未知,但对于 指针 .
就是说,代码看起来不对,因为您需要结构的 大小 ( 而不是 指针的大小),所以使用以下代码:
struct buf_stats *bs = malloc(sizeof(struct buf_states));
你会得到一个错误。
写这样的代码有更好的方法:
struct buf_stats *bs = malloc(sizeof *bs);
表达式 *bs
具有 sizeof
的正确类型,即使您稍后更改类型也是如此。