如何将 C++ 函数传递给采用未指定参数的函数指针的 C 函数?

问题描述 投票:0回答:1

我的 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 function-pointers
1个回答
0
投票

不可能有一种非常干净的方法来处理这个问题,因为当 C 声明被解释为 C++ 时,它就是“错误的”。也就是说,C 类型 bool() 最接近 C/C++ 类型

bool(...)
,并且应该与其 ABI 兼容(因为它们都应用默认参数提升)。
因此,第一步是将函数定义为 variadic(即使它所做的只是调用 
va_arg

几次,然后调用真正的实现)。然后,您可以以类似程度的暴力程度,将省略号添加到回调参数的声明中,或者将指针强制转换为您的函数。任何由此产生的警告均由您保留。

© www.soinside.com 2019 - 2024. All rights reserved.