我导入了这个程序,它解析了很多复杂的文本,用C语言编写.我自己的项目是用C++编写的.
我实际上打算,每当解析器算法找到其中一个键标签时,我的类中的一个(很多)构造函数应该被调用,这样我就可以在txt的末尾有一个很好的结构,如解析过程的结果.
这里的问题:我学会了OOP Java和开始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<mylibraryname_mtype_t>(new MyType); } catch (...) { return nullptr; } } EXTERNC mylibraryname_mytype_t create_mytype_with_int(int val) NOTHROW { try { return static_cast<mylibraryname_mytype_t>(new MyType(val)); } catch (...) { return nullptr; } } EXTERNC void mylibraryname_free_mytype(mylibraryname_mytype_t obj) NOTHROW { try { MyType* typed_obj = static_cast<MyType*>(obj); delete typed_obj; } catch (...) { // Ignore } }
然后,您的C代码应该能够包含相同的头,并在与生成的库链接时使用C++源文件中的定义.
请注意,上面的代码是吞噬异常批发.对于真正的API,您应该提供一种向调用者指示错误的方法(例如,通过输出参数返回已分配的对象并返回状态代码),而不是仅仅抑制它们.
编辑
如评论中所述,"_ t"在技术上是一个保留后缀(如果您的符号具有将来不太可能被标准库使用的前缀,您应该没问题),所以只需确保您的符号包括库名称作为前缀.还应该注意的是,typedef虽然不是必需的,但是旨在使对象的使用比原始的"void*"更加自我记录.