如何从C-File调用C ++构造函数

我导入了这个程序,它解析了很多复杂的文本,用C语言编写。我自己的项目是用C ++编写的。

我实际上打算,每当解析器算法找到一个关键标签时,我的类的一个(很多)构造函数应该被调用,这样我在txt的末尾就会有一个很好的结构,如同解析过程的结果。

问题在于 :我用Java学习了OOP并用这个项目启动了C ++,所以我需要一些帮助:如何从基于C的解析器文件中调用C ++构造函数? 我已经检查了互联网,但要么这个问题太微不足道了,要么我的预期解决方案无效;)

谢谢你的任何建议。

您不能直接调用构造函数,但是您可以创建分配和返回对象实例的工厂函数,并且可以编写这些函数,以便在C ++中提供定义(可以使用“new”来实现分配对象并使用C ++构造函数)但可以从C调用。

在标题中,您应该写:

#ifdef __cplusplus # define EXTERNC extern "C" # define NOTHROW noexcept #else # define EXTERNC # define NOTHROW #endif /* Alias for your object in C that hides the implementation */ typedef void* mylibraryname_mytype_t; /* Creates the object using the first constructor */ EXTERNC mylibraryname_mytype_t mylibraryname_create_mytype() NOTHROW; /* Creates the object using the second constructor */ EXTERNC mylibraryname_mytype_t mylibraryname_create_mytype_with_int(int val) NOTHROW; /* Frees the object, using delete */ EXTERNC void mylibraryname_free_mytype(mylibraryname_mytype_t obj) NOTHROW; 

然后在您的C ++源文件中,您可以执行以下操作:

  EXTERNC mylibraryname_mytype_t mylibraryname_create_mytype() NOTHROW { try { return static_cast(new MyType); } catch (...) { return nullptr; } } EXTERNC mylibraryname_mytype_t create_mytype_with_int(int val) NOTHROW { try { return static_cast(new MyType(val)); } catch (...) { return nullptr; } } EXTERNC void mylibraryname_free_mytype(mylibraryname_mytype_t obj) NOTHROW { try { MyType* typed_obj = static_cast(obj); delete typed_obj; } catch (...) { // Ignore } } 

然后,您的C代码应该能够包含相同的头,并在与生成的库链接时使用C ++源文件中的定义。

请注意,上面的代码是吞噬exception批发。 对于真正的API,您应该提供一种向调用者指示错误的方法(例如,通过输出参数返回已分配的对象并返回状态代码),而不是仅仅抑制它们。

编辑
正如评论中所指出的那样,“_ t”在技术上是一个保留的后缀(如果您的符号具有将来不太可能被标准库使用的前缀,那么您应该没问题),所以只需确保您的符号包含库将名称作为前缀。 还应该注意的是,typedef虽然不是必需的,但是旨在使对象的使用比整个地方的原始“void *”更加自我记录。