如何从 C 文件调用 C++ 构造函数

2024-01-13

我导入了这个程序,它正在解析大量复杂的文本,并且是用 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<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,您应该提供一种向调用者指示错误的方法(例如,通过输出参数返回分配的对象并返回状态代码),而不是仅仅抑制错误。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 C 文件调用 C++ 构造函数 的相关文章

随机推荐

  • Mercurial 中有没有办法删除本地提交?

    所以我在 Mercurial 中不断犯一个愚蠢的错误 很多时候 我会在不执行 hg pull 和 hg update 的情况下开始工作 当我尝试推送更改时 出现错误 有什么办法可以删除我的本地提交这样我就可以避免创建多个头 分支等 我只想删
  • SQL历史表设计

    我需要设计一个历史表来跟踪编辑时特定记录上更改的多个值 Example 用户将看到一个编辑记录的页面 头衔 先生姓名 乔电话 555 1234出生日期 1900 10 10 如果用户更改任何这些值 我需要跟踪旧值并记录新值 我想到使用这样的
  • 一个控制器中的 AngularJS window.onbeforeunload 正在另一个控制器上触发

    这是我的问题 我有两个视图 View1 和 View2 以及每个视图的控制器 Ctrl1 和 Ctrl2 在 View1 中 我试图在用户意外离开页面而不保存更改之前警告用户 我正在使用 window onbeforeunload 它工作得
  • ThreadAbortException(WebClient 使用 DownloadFile 从服务器获取文件)

    参考我的先前的问题 https stackoverflow com questions 2444888 webclient using download file to grab file from server handling exce
  • 从jsp传递参数到servlet

    如何使用不属于表单任何字段的表单将参数从 jsp 传递到 servlet 而不使用 session 我认为代码可能类似于下面的示例 但对我不起作用 请帮助我 在index jsp中
  • 将玩家分配到桌子上

    考虑N 4k玩家 k桌子和许多氏族 以便每个成员可以属于一个氏族 一个氏族最多可以包含k玩家 我们想要组织 3 轮游戏 这样 对于每张正好容纳 4 名玩家的桌子 坐在那里的 2 名玩家不会属于同一部落 并且在后面的几轮中 坐在那里的 2 名
  • 如何提取当前本地时间偏移值?

    我在尝试格式化和显示一些 IBM 大型机 TOD 时钟数据时遇到了一些困难 我想以 GMT 和本地时间格式化数据 作为默认时间 否则在用户指定的区域中 为此 我需要获取距 GMT 的本地时间偏移值 以有符号整数秒数表示 在zoneinfo
  • 我可以在 Java 中创建自签名证书,该证书将自动受到 Web 浏览器的信任吗?

    我已经使用 keytool 为我的 Java 应用程序生成了自签名证书 但是 当我在浏览器中访问该网站时 它总是会弹出一条警告 说该网站不拥有该证书 有没有办法自签名 修改证书 这样我就不会在浏览器 服务器和浏览器都位于同一主机上 我使用
  • 如何增加pandoc执行时的堆内存?

    我正在努力将 docx 转换为 epub 文档包含大量图像 执行转换时 出现错误 pandoc exe Heap exhausted Current maximum heap size is 1073741824 bytes 1024 MB
  • print(... sep='', '\t' ) 是什么意思?

    我在试图找到这个问题的答案时遇到了一些麻烦 我想知道语法是什么sep and t方法 我找到了一些有关它的信息 但我不太明白使用该语法的目的是什么 我正在寻找它的作用以及何时 为何使用它的解释 一个例子sep 正在使用 print Prop
  • 我想将枚举值打包到 Bundle 中并获取为枚举

    我有这样的枚举 enum Status READY DISCONNECTED RECEIVING more 我想通过 Bundle 将该枚举的值发送到另一个线程 另一个线程想从 Bundle 中提取枚举值 如何巧妙地做到这一点 Bundle
  • GWT Tree 小部件吞下箭头键盘事件,这使得 TreeItems 中包含的文本框不响应箭头键

    在 GWT 1 6 4 中可以轻松重现 Tree tree new Tree tree addItem new TextBox 问题出在 Tree 中的 onBrowserEvent 上 switch eventType case Even
  • 如何在iOS中的静态库中添加xib文件

    我正在尝试在静态库中添加 xib 文件或任何其他视图控制器文件 但我无法这样做 你能帮我么 如果可以的话请添加完整的源代码 第一个视图中的 是 按钮 当单击该按钮时 新的视图控制器会出现一些内容 比如说背景颜色的变化 如何为此创建静态库 这
  • 什么是 Glew、Glut 和 glfw3?哪些在 Opengl 3/4 中已弃用 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在网上阅读有关 OpenGL 3 和 4 与以前版本有何巨大差异的内容 一些教程要求 include
  • 如何将 sbt 与 Google App Engine 结合使用?

    有人尝试过设置 sbt 来与 Google App Engine 一起使用吗 我梦想在源代码更改后使用开发服务器自动重新加载 如需快速演示 您可以克隆或下载我所做的内容here http github com leolannenmaki s
  • javax.validation.UnexpectedTypeException:找不到类型的验证器:

    以下是当我们尝试对整数类型的大小和模式进行验证时出现的错误 你能建议一下 我们需要在 validator bean xml 中设置整数类型的大小和模式验证 05 58 57 342 ERROR ErrorLoggerEJBIntercept
  • 由于主键限制导致 Cassandra CQL SELECT/DELETE 问题

    我需要在 Cassandra 表中存储需要推送到用户新闻源页面的最新更新以供以后检索 我的表的架构如下 CREATE TABLE newsfeed user name text post id bigint post type text f
  • Gitosis 可以强制执行正确的用户名/电子邮件吗?

    Gitosis 能够根据公钥 私钥对对用户进行身份验证 它能够找出当前哪个用户正在提交 但是 用户名和电子邮件取自客户端的 Git 配置 git config user name 等 可以设置为任意值 有什么方法可以将用户名和电子邮件与他们
  • Huggingface-hub 0.0.12 需要打包 >=20.9,但您将拥有不兼容的打包 20.4

    Huggingface hub 0 0 12 需要打包 gt 20 9 但您将拥有不兼容的打包 20 4 您必须更新huggingface hub through pip install upgrade huggingface hub
  • 如何从 C 文件调用 C++ 构造函数

    我导入了这个程序 它正在解析大量复杂的文本 并且是用 C 编写的 我自己的项目是用 C 编写的 我实际上的意图是 每当解析器算法找到一个关键标签时 就应该调用我的类的一个 许多 构造函数 这样我就会在 txt 的末尾有一个很好的结构 如下所