【问题标题】:Calling a function from a DLL which is developed in C++ from C从 C 中用 C++ 开发的 DLL 调用函数
【发布时间】:2025-12-25 13:50:12
【问题描述】:

dll中的函数原型如下

void Foo(int arg1, int& arg2);

问题是,如何在C中声明函数原型?

声明合法吗?

void Foo(int, int*);

【问题讨论】:

  • 由于dll是第三方制作的,恐怕dll中的功能无法更改。
  • 那么你需要编写一个“适配器 DLL”或者你必须使用这个 DLL 在你的程序中嵌入这个适配器。
  • 您的代码可能是 C 语言,但我认为问题更多的是关于 C++
  • @StoryTeller 它是关于两者的接口,这是一种罕见的情况,两个标签都是合适的......
  • 感谢你们俩。 :)

标签: c++ c dll


【解决方案1】:

您需要一个适配器,由一个 C++ 翻译单元和一个可用于 C 和 C++ 的标头组成,如下所示(当然使用更好的名称):

adapter.h:

#ifndef ADAPTER_H
#define ADAPTER_H
#endif

#ifdef __cplusplus
extern "C" {
#endif

void adapter_Foo(int arg1, int *arg2);
// more wrapped functions

#ifdef __cplusplus
}
#endif

#endif

adapter.cpp:

#include "adapter.h"
// includes for your C++ library here

void adapter_Foo(int arg1, int *arg2)
{
    // call your C++ function, e.g.
    Foo(arg1, *arg2);
}

您可以将此适配器编译为单独的 DLL,也可以将其作为主程序的一部分。在您的 C 代码中,只需 #include "adapter.h" 并调用 adapter_Foo() 而不是 Foo()

【讨论】:

  • 如果 C++ 引用在 C 中表示为 const 指针,会不会更接近?
  • @cdarke 我认为这并不重要。使指针(而不是它指向的数据)const 只会影响函数内部的代码,而且它只是一个包装器......
  • @cdarke - const 应用于函数声明中的参数时会被忽略(您会得到与没有 const 相同的声明)。如果您希望编译器捕获修改,则可以在定义处添加它。但就像菲利克斯说的,我也认为这里没有实际意义。
  • 为什么不让定义尽可能准确?
  • @alk a const like in int *const arg2 对调用者完全没有影响,那何必呢?这只是不必要的混乱。
【解决方案2】:

声明合法吗?

是的,但它没有声明相同的函数。如果您需要 C API,则不能使用引用。坚持一个指针,并确保该函数具有 C 链接:

extern "C" void Foo(int, int*) {
   // Function body
}

如果您无法修改 DLL 代码,则需要为其编写一个 C++ 包装器,以公开适当的 C API。

【讨论】: