该功能在DLL有以下调用DLL中这是在C++开发的由C
void Foo(int arg1, int& arg2);
问题的原型,如何申报在C函数原型的功能?
该声明是否合法?
void Foo(int, int*);
该功能在DLL有以下调用DLL中这是在C++开发的由C
void Foo(int arg1, int& arg2);
问题的原型,如何申报在C函数原型的功能?
该声明是否合法?
void Foo(int, int*);
是声明是否合法?
它是,但它没有声明相同的功能。如果您需要C API,则不能使用参考。坚持一个指针,并确保该函数有C链接:
extern "C" void Foo(int, int*) {
// Function body
}
如果您不能修改该DLL的代码,你需要为它编写一个C++包装,暴露了一个适当的C API。
我明白了,谢谢你的帮助。 –
需要一个适配器,由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
@cdarke我不认为这很重要。使指针(而不是它指向的数据)'const'只影响函数内部的代码,并且它只是一个包装,反正... –
@cdarke - 当应用于函数声明中的参数时,const将被忽略你会得到和没有'const'一样的声明)。在定义中,如果您希望编译器捕获修改,可以添加它。但就像费利克斯说的那样,我也认为这里没有实际意义。 – StoryTeller
由于dll是由第三方制作的,恐怕dll中的函数无法更改。 –
然后,您需要编写一个“适配器DLL”**或**,您必须在使用此DLL的程序中嵌入此适配器。 –
你的代码可能在C中,但问题实际上更多的是关于C++,我认为 – StoryTeller