我一直想要构建一个共享库,它将利用类来保持其运行清洁(可能需要许多输入或处理),尽管我仍希望以C平台为目标。
如果我在我的所有原型上应用extern“C”{},并在示例中提供了一组模拟类函数的公开函数,以便对象不是“必需”来使用我的库,那些正常函数是否可以在将链接到它的C程序?
答案 0 :(得分:6)
如果你在你描述的fasion中创建一个dll,也就是说,所有接口都是extern“C”,接口中的所有类型都是POD,那么是的,你在C或.NET中使用它几乎没有问题
示例:
class MyClass
{
public:
MyClass(float x) {...}
void method(int x) {...}
~MyClass() {...}
};
#define MYAPI extern "C" __declspec(dllexport) //or whatever the syntax is for your compiler
MYAPI MyClass* CreateMyClass(float x)
{
return new MyClass(x);
}
MYAPI void MyClass_method(MyClass* p, int x)
{
return p->method(x);
}
MYAPI void DestroyMyClass(MyClass* p )
{
delete p;
}
答案 1 :(得分:3)
您可能需要为要包含的C源提供单独的头文件。 C头文件不应该包含C编译器可能需要解析的任何C ++代码。在那里,您将为C ++库提供C接口。通过提供extern "C"
修饰符,如您所指示的那样,对此头文件中的函数声明,您告诉编译器使链接适用于C程序。
因此,如果您需要C程序来保存对象的引用,只需将它作为void *
指针在C接口中来回传递。在C中你只是把它当作一个神奇的饼干。
其他帖子说通过DLL公开界面,这也是有用的知识,但严格来说不是(标准)语言方面。
修改强>
哎呀。extern "C"
部分是C ++语法。因此,在C ++方面,您必须使用extern "C"
声明C接口函数,但在C端,您不能使用该语法。你可以通过常见的习语来实现这个目标:
#ifdef __cplusplus
extern "C" {
#endif
void foo();
#ifdef __cplusplus
}
#endif