这是重新编写的一个问题,与先前的版本完全不同;我认为第一个版本省略了重要细节,而这个版本提供了所有上下文。
我有一份C++ API的头文件。该API声明了几个类,如下所示:
API还有第二组类似于这样的函数:
我们称之为“核心函数”,因为它们是从主应用程序实际导出的符号,而不是C++类。核心函数具有C语言链接(即它们被声明为
据我所理解,该代码从主机应用程序接收一些对象,这些对象被认为是指向
这适用于所有的C++类和方法。聪明,对吧?
现在,有人可以解释一下这是什么意思吗? :) 这不是一个真正的C++ API,对吗?对我来说,它更像是一个在C API之上的薄薄的C++包装器。如果是这样,我能重新声明核心函数以去除C++部分吗?我知道如何编写围绕C++的C包装器(实际上,我已经写好了),但是,如果可能的话,我宁愿丢掉包装器直接使用函数。但是如何去掉C++的东西?
例如,可能会有一个带有引用的函数:
我有一份C++ API的头文件。该API声明了几个类,如下所示:
class Foo
{
public:
inline void Bar(void);
/* more inlines */
private:
inline Foo();
/* maybe more inline constructors */
}
即没有成员变量,所有函数都是内联和公共的,除了构造函数。构造函数是私有的,因此,就我所理解的C ++而言,我无法真正调用它们。为了创建这些对象,我应该使用auto_ptr
来管理它们:
class FooAutoPtr : public std::auto_ptr<Foo>
{
public:
inline FooAutoPtr();
/* one for each Foo constructors */
}
API还有第二组类似于这样的函数:
void Foo_Bar(void *self);
Foo* Foo_Constructor();
我们称之为“核心函数”,因为它们是从主应用程序实际导出的符号,而不是C++类。核心函数具有C语言链接(即它们被声明为
extern "C"
),但它们被声明为使用和返回C++类型(例如,它们可以使用引用:Foo &foo
)。最后,头文件包含了C++类内联函数的实现。所有这些函数都是相同的:它们调用核心函数。例如,FooAutoPtr
构造函数是这样的:inline FooAutoPtr::FooAutoPtr()
{
reset(Foo_Constructor());
}
据我所理解,该代码从主机应用程序接收一些对象,这些对象被认为是指向
Foo
的指针,并将auto_ptr
小工具更改为指向此对象。但对于开发人员来说,它看起来像是指向Foo
的真正指针。调用Foo::Bar()
的方式如下:inline Foo::Bar()
{
Foo_Bar(this);
}
这适用于所有的C++类和方法。聪明,对吧?
现在,有人可以解释一下这是什么意思吗? :) 这不是一个真正的C++ API,对吗?对我来说,它更像是一个在C API之上的薄薄的C++包装器。如果是这样,我能重新声明核心函数以去除C++部分吗?我知道如何编写围绕C++的C包装器(实际上,我已经写好了),但是,如果可能的话,我宁愿丢掉包装器直接使用函数。但是如何去掉C++的东西?
例如,可能会有一个带有引用的函数:
Bar& Foo_GetBar(void* self, const Baz& baz, int& i);
现在我从我的C++包装器中这样调用它:
typedef struct bar bar_t; /* and others */
/*...*/
bar_t*
foo_get_bar(foo_t* foo, baz_t* baz, int* i)
{
return (bar_t*) &Foo_GetBar(foo, *(Baz*)baz, *i);
}
它可以正常运行(我不知道是如何实现的)。但我更希望将其重新声明为:
/* type? */ Foo_GetBar(foo_t*, /* type? /*, /* type? */);
更新: 我发现了一个有趣的事情,证实了尼尔的答案。这是一个使用相同API的Common Lisp代码。(当然,它必须使用C部分。)从源代码中我可以(勉强)读到的是,作者只是在引用处使用指针。以下是将C++声明转换为Lisp的代码片段:
;; use * instead of & - we're not interested in C++ details
line (regex-replace-all "&" line "*")
就是这样 :) 谢谢大家!
c
和c++
。这可真是难得的出现…… - ildjarnfoo_get_bar
仍然是使用 C++ 编译器编译的,对吧? - Krizz