将C ++引用包装到C API中

时间:2012-01-24 07:15:08

标签: c++ c reference

我有一个头文件,用于组合C ++和C API。 C部分包含在extern "C"中,但声明本身看起来与C不同;例如:

foo::Bar& Foo_Baz_GetBarOfQux(void *_self, const foo::Qux &qux);

有没有办法从普通C中实际使用它?我显然不能使用这个标题,但也许我可以用某种方式重新声明它:

/* type? */ Foo_Baz_GetBarOfQux(void*, const /* type? */);

让我感到困惑的是如何声明这些引用的类型(如果可能的话)。

P.S。我知道我可以在此基础上编写自己的C包装器:我将类声明为不透明结构:

typedef struct foo_bar foo_bar_t;
typedef struct foo_baz foo_baz_t;
typedef struct foo_qux foo_qux_t;

然后编写一个包含上述函数的类C函数:

extern "C" 
foo_bar_t*
foo_baz_get_bar_of_qux(
    foo_baz_t* baz,
    foo_qux_t* qux)
{
    return (foo_bar_t*) Foo_Baz_GetBarOfQux(baz, *(foo::Qux*)qux);
}

但我想知道我是否可以直接使用原始Foo_Baz_GetBarOfQux()

2 个答案:

答案 0 :(得分:7)

不能直接使用Foo_Baz_GetBar()c++中对成员函数的调用涉及隐式传递this代码中不存在的c指针。

答案 1 :(得分:2)

一般来说,使用不透明结构会更好。

在代码的“C”界面中,不要试图在不透明的结构中撬动,只是尽职尽责地传递指针。

在“C ++”部分中,您应该定义结构并实际填充它们(我会避免盲目的类型转换)。

当然,“C ++”部分不应该在“C”标题中公开,以免它混淆C编译器。