c++ - 如何从C调用C++函数?

标签 c++ c visual-c++ extern-c

我知道这个。

从 C++ 调用 C 函数:

如果我的应用程序是用 C++ 编写的,并且我必须从用 C 编写的库中调用函数。那么我会使用

//main.cpp

extern "C" void C_library_function(int x, int y);//prototype
C_library_function(2,4);// directly using it.

这不会破坏名称 C_library_function 并且链接器会在其输入 *.lib 文件中找到相同的名称,问题就解决了。

从 C 调用 C++ 函数???

但是在这里我正在扩展一个用 C 编写的大型应用程序,并且我需要使用一个用 C++ 编写的库。 C++ 的名称修改在这里造成了麻烦。链接器提示未解析的符号。嗯,我不能在我的 C 项目上使用 C++ 编译器,因为这会破坏很多其他东西。出路何在?

顺便说一句,我正在使用 MSVC

最佳答案

您需要创建一个 C API 来公开 C++ 代码的功能。基本上,您需要编写声明为 extern“C” 的 C++ 代码,并且具有包装 C++ 库的纯 C API(例如,不使用类)。然后使用您创建的纯 C 包装器库。

即使 C 不是面向对象的,您的 C API 也可以选择遵循面向对象的风格。例如:

// *.h file
// ...
#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
// ...
// *.cpp file
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++函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39816710/

相关文章:

c++ - 传递指向变量的指针或指向变量的指针的地址会导致相同的行为

c++ - 嵌入式 Linux 中链接 'libstdc++' 库已损坏

c++ - 如何访问 "int20_t"中的数据?

c - 如何从我的 C 程序运行 bcdedit?

C++:Visual Studio 2013 中奇怪的虚拟成员函数指针

.net - 将 std::vector<T> 转换为 .NET List<U> 的最有效方法是什么?

c++ - std::tr1::function 如何获取签名特征的参数并特化类*

c++ - 为什么 QObject::disconnect(const QMetaObject::Connection &connection) 采用 const 参数来修改它?

c - 对 `function' 的 undefined reference

c - 使用 '__progname' 而不是 argv[0]