【问题标题】:Correct use of a generic function pointer正确使用泛型函数指针
【发布时间】:2013-02-19 21:04:38
【问题描述】:

给定以下用于更新双向链表中节点的函数声明:

uint8 dl_update(DL_LIST **node, uint16 new_tag, void *new_object,
    uint32 new_size, void (*destructor)(void*))

以及对该函数的以下调用:

dl_update(&dlt_list, _TAG, zulu, sizeof(*zulu),
    (void(*)(void*)) &_free_dlt_object(delta));

最后一个参数会导致编译器发出错误消息“lvalue required as unary '&' operator”怎么办?我传递的析构函数(以及它所操作的结构)定义如下:

typedef struct DLT_OBJECT {
    char *word;
    uint8 number;
} DLT_OBJECT;

void _free_dlt_object(DLT_OBJECT *object) {
    free(object->word);
    free(object);
}

以下question 似乎暗示可以转换函数指针,所以我不认为我这样做会导致问题,尽管考虑到我的代码在裸​​机嵌入式系统上运行(列为question 中的一个可能的陷阱)我不确定。

这是一个简单的语法错误,还是更多的结构问题?我一直认为使用 void 指针参数声明函数指针是将通用函数指针传递给其他函数的好方法......

【问题讨论】:

    标签: c function-pointers


    【解决方案1】:

    当使用函数指针时,你只是在传递一个函数,所以你可以像这样调用

    dl_update(&dlt_list, _TAG, zulu, sizeof(*zulu), _free_dlt_object);
    

    【讨论】:

    • 我(再次)感到困惑基思。您正在传递函数而不是指向函数的指针,并且 AFAIK 它们不是一回事。你怎么能省略函数指针的参数呢?我无法将您的答案与this 帖子中给出的示例代码相一致...
    • @RBE 函数指示符在几乎所有上下文中都隐式转换为函数指针。当你将一个函数(-指针)传递给一个函数时,你不能在那里写一个参数,因为它是你传递的函数(指针),而不是函数调用的结果。
    • @RBE 在dl_update 中调用_free_dlt_object 的参数将由dl_update 提供。这就是传递函数的重点,以便接收者可以使用它需要传递的任何参数来调用它们。
    • @RBE 在这种情况下,函数 dl_update 基本上是在说,嘿,作为此更新的一部分,我将不得不删除一些对象,但我不知道需要做什么释放它们,所以给我一个我想删除对象时可以调用的函数。
    • @RBE:围绕函数指示符和函数指针的语法问题有点奇怪,但 _free_dlt_object&_free_dlt_object*_free_dlt_object 甚至 *****_free_dlt_object 的计算结果都是一样的。
    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多