gpt4 book ai didi

c - 防止 C 中不兼容的函数转换?

转载 作者:太空狗 更新时间:2023-10-29 15:26:16 29 4
gpt4 key购买 nike

有时在没有的情况下转换函数回调很有用。

例如,我们可能有一个函数来复制一些数据:
struct MyStruct *my_dupe_fn(const struct MyStruct *s)

但将其作为通用回调传递:
typedef void *(*MyGenericCopyCallback)(void *key);

例如:
ensure_key_in_set(my_set, my_key, (MyGenericCopyCallback)my_dupe_fn);

因为 const struct MyStruct *void * 之间的区别在这种情况下不会引起问题,所以它不会引起任何错误 (at至少在函数中调用它自己)

但是,如果稍后将参数添加到 my_dupe_fn,这可能会导致错误不会给出编译器警告。


有没有办法转换一个函数,但如果参数或返回值大小不同,仍然会显示警告?



强制免责声明:C 当然不是*安全*,但在广泛使用的语言中防止潜在错误的方法仍然有用。

最佳答案

您说“不会导致任何错误”,但是即使在您的示例代码中,它也会导致通过具有不兼容的返回类型或参数类型的函数指针调用函数的未定义行为。

如果你想依赖未定义的行为,那么这就是你要承担的风险。依赖UB迟早会出bug。一个更好的主意是重新设计回调接口(interface),使其不依赖于未定义的行为。例如,只使用正确类型的函数作为回调函数。

在您的示例中,这可能是:

typedef void *MyCallback(void *key);    // style: avoid pointer typedefs

struct MyStruct *my_dupe_fn(const struct MyStruct *s)
{ ... }

void *my_dupe_fn_callback(void *s)
{
return my_dupe_fn(s);
}

void generic_algorithm(MyCallback *callback)
{
// ....
ensure_key_in_set(my_set, my_key, callback);
// ....
}

// elsewhere
generic_algorithm(my_dupe_fn_callback);

请注意缺少转换。管理不使用任何函数转换的样式策略比允许某些类型的策略更简单。

关于c - 防止 C 中不兼容的函数转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157518/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com