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

use*_*931 18 c c++ oop import constructor

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

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

这里的问题:我学会了OOP Java和开始C++这个项目,所以我需要一点点的帮助:我怎么能调用C++构造出我的基于C的解析器的文件?我已经检查了互联网,但要么这个问题太琐碎了,要么我的预期解决方案无效;)

谢谢你的任何建议.

Mic*_*yan 23

您不能直接调用构造函数,但是您可以创建分配和返回对象实例的工厂函数,并且可以编写这些函数,以便在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;
Run Code Online (Sandbox Code Playgroud)

然后在您的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
   }
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 只要确保你在`new`调用[以及任何可能以任何方式"抛出"的任何其他调用]周围做'try ... catch ...`. (4认同)
  • 我只是为了说明而使用了"mytype".您可能会更改它以匹配实际对象的类型.标题将是与您的类型对应的*.h文件,源将是*.cpp文件.您将*.h文件包含在*.c文件中并从那里调用这些函数. (2认同)