list.h中的list_entry()返回一个警告

时间:2011-02-17 09:10:23

标签: c linux gcc linux-kernel gnu

考虑这段代码:

 struct Trade
        {
         float Price;
             char* time;
             int shares;
             struct list_head *tradeList;
        };
typedef struct Trade Trade;

    void DisplayTrades(Trade* TBook)
        {
            if(TBook==NULL)
            {
                printf("NO TRADES\n");
                return;
            }
            struct list_head *pos;
            Trade *tmp;
            pos = TBook->tradeList;
            __list_for_each(pos,TBook->tradeList)
            {
                tmp = list_entry((pos),Trade,tradeList);
                printf("Price %f, Time %s, Shares %d\n",tmp->Price,tmp->time,tmp->shares);
            }

        }

在这段代码中,当我编译时,编译器gcc会在引发list_entry的行中返回initialization from incompatible pointer type的警告。 我在同一代码的其他地方使用了list_entry,它的工作没有任何故障。所以让我印象深刻的唯一一件事就是我将非预期的变量类型传递给函数,因此附加了结构Trade的定义。即使这样,问题仍然存在。

非常感谢,要知道出了什么问题。

编辑:这只是一个小代码的小片段。我为使它看起来很道歉,我试图在不存在时使用Trade *对象。在代码中,我确实使用了typedef来定义struct Trade;

2 个答案:

答案 0 :(得分:3)

为此,pos必须是一个实际的列表头指针,但结构字段应该是list_head而不是list_head指针:

struct Trade
        {
             float Price;
             char* time;
             int shares;
             struct list_head tradeList;
        };

然后:

  void DisplayTrades(Trade* TBook)
        {
            if(TBook==NULL)
            {
                printf("NO TRADES\n");
                return;
            }
            struct list_head *pos;
            Trade *tmp;
            __list_for_each(pos,&TBook->tradeList)
            {
                tmp = list_entry((pos),Trade,tradeList);
                printf("Price %f, Time %s, Shares %d\n",tmp->Price,tmp->time,tmp->shares);
            }

        }

答案 1 :(得分:0)

DisplayTrades 功能中,在将Trade结构的指针声明为参数时,您必须使用

struct Trade * Tbook。