如何从 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++ 构造函数 的相关文章

  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • 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 的末尾有一个很好的结构 如下所