允许我的C ++库使用C​​(缩减函数集)

时间:2011-03-30 12:00:27

标签: c++ c backwards-compatibility

我一直想要构建一个共享库,它将利用类来保持其运行清洁(可能需要许多输入或处理),尽管我仍希望以C平台为目标。

如果我在我的所有原型上应用extern“C”{},并在示例中提供了一组模拟类函数的公开函数,以便对象不是“必需”来使用我的库,那些正常函数是否可以在将链接到它的C程序?

2 个答案:

答案 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