【问题标题】:cast to pointer from integer of different size warning when assigning pointer to function将指针分配给函数时,从不同大小的整数警告转换为指针
【发布时间】:2017-04-23 15:36:54
【问题描述】:

为什么在将匿名函数分配给指向结构中函数字段的指针时会收到此警告?

这是我的结构:

typedef struct list_node_t  {...} ListNode;

typedef struct list_t {
    ListNode* head;
    ListNode* current;
    ...
    //pointer to function fields
    int (*hasNext)();
    ...
}List;

这里我为 hasNext 分配了一个匿名函数。它会导致警告。

List* makeNewList( ){
    List* list = (List*)malloc(sizeof(List));
    list->head = list->tail = NULL;
    list->current = list->head;
    list->hasNext = (int   (*)(void)) (list->current==list->tail? 0:1);
    return list;
}

使用 gcc -c -Wall list.c 编译时会返回此消息:

list.c: In function ‘makeNewList’:
list.c:35:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
     list->hasNext = (int   (*)(void)) (list->current==list->tail? 0:1);

为什么?我希望 list->hasNext 是指向返回 int 的函数的指针,而不是标量 int。我做错了什么?

【问题讨论】:

  • 您将值 0 或 1 分配给函数指针,而不是应有的函数指针。
  • list->hasNext = (int (*)(void)) (list->current==list->tail? 0:1); 这行应该做什么?这没有任何意义。为什么要将函数指针设置为值 1?

标签: c casting function-pointers


【解决方案1】:

为什么你认为 C 语言有匿名函数,并且具有那种特殊的语法?

你需要脚踏实地,真正定义函数:

static int list_has_next(const List *list)
{
  return list->current == list->tail;
}

函数也(当然)必须带参数,C 中没有隐式参数。您需要更新结构中的函数指针以使其兼容:

int (*has_next)(const List *list);

另外,stop casting the return value of malloc()

【讨论】:

  • 没有必要在每个节点中都保留指向同一个函数的指针。
  • @n.m.不,当然不是,但 OP 似乎想要一个。根据列表中的内容,也许有不同类型的“有下一个”检查,或者我不知道。
  • 糟糕。误读代码,请忽略。它在列表中,而不是在列表节点中。
  • 为什么我认为C有匿名函数? K&R 在调用具有指向函数参数的指针的函数时显示此语法: void qsort(void lineptr, int left, int right, int (*comp)(void *, void *));和调用: qsort((void*), listptr, 0, nlines-1, (int ()(void, void*))(numeric?numcmp:strcmp));哦,再看一遍, (numeric?numcmp:strcmp) 返回两个函数名之一。那里没有“内联实现”。
  • 在不发送列表作为参数的情况下,没有其他方法可以实现 hasNext 吗?任何其他方式来实现可以支持 hasNext 和 getNext 而不将节点实现暴露给外部的迭代器?一个具有静态列表的函数,因此它可以在调用时记住当前的?但是可以有两个该迭代器函数的实例,并将不同的列表分配给它们各自的静态字段?
猜你喜欢
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
相关资源
最近更新 更多