【问题标题】:Implicit conversion of C pointer warning [duplicate]C指针警告的隐式转换[重复]
【发布时间】: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


【解决方案1】:

问题是这个声明中使用的结构struct foo

typedef struct {
    struct foo* next;
    ^^^^^^^^^^
} foo;

从未定义过。

作为这个表达式语句的结果

curr = curr->next;

左操作数的类型为foo *,而右操作数的类型为struct foo *

改写结构体定义如下

typedef struct foo {
    struct foo* next;
} foo;

【讨论】:

    猜你喜欢
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多