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

 坚强的浅悠轩_871 发布于 2023-01-09 10:05

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

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

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

谢谢你的任何建议.

1 个回答
  • 您不能直接调用构造函数,但是您可以创建分配和返回对象实例的工厂函数,并且可以编写这些函数,以便在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*"更加自我记录.

    2023-01-09 10:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有