首页 > 后端开发 > C++ > 如何从 C 代码调用 C 函数并避免名称修改问题?

如何从 C 代码调用 C 函数并避免名称修改问题?

Mary-Kate Olsen
发布: 2024-12-25 01:58:13
原创
858 人浏览过

How Can I Call C   Functions from C Code and Avoid Name Mangling Issues?

从 C 调用 C 函数:导航名称修改

使用混合语言应用程序时,从 C 内部调用 C 函数的挑战由于 C 的名称损坏而出现。与使用简单函数名称的 C 不同,C 采用复杂的命名方案来解析重载函数和类,从而导致不同的函数签名。在尝试解析未解析的符号时,这可能会导致链接器错误。

在这种情况下,解决方法包括创建一个提供对 C 功能的访问的 C API。这需要编写声明为 extern "C" 的 C 代码并遵守纯 C 语法,避免类等面向对象的功能。随后,创建一个 C 包装库来公开 C 库的功能。

例如,考虑以下 C API:

#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif

typedef void* mylibrary_mytype_t;

EXTERNC mylibrary_mytype_t mylibrary_mytype_init();
EXTERNC void mylibrary_mytype_destroy(mylibrary_mytype_t mytype);
EXTERNC void mylibrary_mytype_doit(mylibrary_mytype_t self, int param);

#undef EXTERNC
登录后复制

相应的 C 实现如下:

mylibrary_mytype_t mylibrary_mytype_init() {
  return new MyType;
}

void mylibrary_mytype_destroy(mylibrary_mytype_t untyped_ptr) {
   MyType* typed_ptr = static_cast<MyType*>(untyped_ptr);
   delete typed_ptr;
}

void mylibrary_mytype_doit(mylibrary_mytype_t untyped_self, int param) {
   MyType* typed_self = static_cast<MyType*>(untyped_self);
   typed_self->doIt(param);
}
登录后复制

这种方法允许您从 C 代码访问 C 功能,同时减轻名称修改问题。

以上是如何从 C 代码调用 C 函数并避免名称修改问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板