我的 C 依赖库(编辑:实际上我们正在编写一个 Postgres 扩展,因此依赖项是 Postgres 14.4)有一个函数
bool expression_tree_walker(Node *node, bool (*walker) (), void *context)
其中第二个参数
bool (*walker) ()
采用unspecified个参数,根据https://en.cppreference.com/w/c/language/function_declaration#:~:text=unspecified.
在我的 C++ 代码中,我想将函数
static bool my_walker(Node *node, struct my_ctx *ctx)
传递给 expression_tree_walker
,但由于 C++ 将 bool (*walker) ()
解释为采用 no 参数的函数,因此直接传递它不会编译:
我知道我可以将其转换为
bool (*) ()
但这不会通过我们正在使用的 -Wcast-function-type
检查。我也知道我可以使用像 (bool (*) ()) (void (*) ()) my_walker
这样的双重转换来抑制此警告,但我认为这有点hacky。有没有推荐的更好的方法来实现这一点?
不可能有一种非常干净的方法来处理这个问题,因为当 C 声明被解释为 C++ 时,它就是“错误的”。也就是说,C 类型 bool()
最接近 C/C++ 类型
bool(...)
,并且应该与其 ABI 兼容(因为它们都应用默认参数提升)。因此,第一步是将函数定义为 variadic(即使它所做的只是调用
va_arg
几次,然后调用真正的实现)。然后,您可以以类似程度的暴力程度,将省略号添加到回调参数的声明中,或者将指针强制转换为您的函数。任何由此产生的警告均由您保留。