【发布时间】:2019-11-29 17:29:18
【问题描述】:
我使用的链表定义如下:
typedef struct {
struct foo* next;
} foo;
假设它已经设置了名为linked_list的头指针,我想遍历链表如下:
foo* curr = linked_list;
while(curr->next) {
curr = curr->next;
}
我的编译器 (Clang) 抛出关于从 struct foo* 转换为 foo* [-Wincompatible-pointer-types] 的警告
我知道我可以通过强制转换来抑制这个警告,但是有没有更好的方法来做到这一点?
【问题讨论】:
-
您的代码没有在任何地方定义
struct foo。 -
一般经验法则:不要使用
typedef,因为它通常会引起混淆。 -
您认为“使用演员表”是解决问题的错误方法的感觉很好——保持这种敏感性。使用强制转换很少是解决问题的最佳方法。有时,它是必要的——创建演员表是有原因的。但是演员表经常被应用在太多的情况下。他们很危险。使用强制转换声称“在这种情况下,我比编译器更了解 C”,但这种情况很少见。
-
警告是合法的:A struct foo* 与指向 foo 的指针类型不同(这是 struct { struct foo* next; } 的 typedef)......如果你不这样做不在乎您可以强制转换或使用 void* ,这很乐意让您混合指针类型。或者你可以只使用兼容的指针:)?
标签: c struct types declaration