从 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中文网其他相关文章!