2017-08-30 79 views
5

该功能在DLL有以下调用DLL中这是在C++开发的由C

void Foo(int arg1, int& arg2); 

问题的原型,如何申报在C函数原型的功能?

该声明是否合法?

void Foo(int, int*); 
+0

由于dll是由第三方制作的,恐怕dll中的函数无法更改。 –

+1

然后,您需要编写一个“适配器DLL”**或**,您必须在使用此DLL的程序中嵌入此适配器。 –

+0

你的代码可能在C中,但问题实际上更多的是关于C++,我认为 – StoryTeller

回答

8

是声明是否合法?

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

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

如果您不能修改该DLL的代码,你需要为它编写一个C++包装,暴露了一个适当的C API。

+0

我明白了,谢谢你的帮助。 –

5

需要一个适配器,由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()

+0

如果C++引用在C中被表示为一个'const'指针,它会不会更接近? – cdarke

+1

@cdarke我不认为这很重要。使指针(而不是它指向的数据)'const'只影响函数内部的代码,并且它只是一个包装,反正... –

+0

@cdarke - 当应用于函数声明中的参数时,const将被忽略你会得到和没有'const'一样的声明)。在定义中,如果您希望编译器捕获修改,可以添加它。但就像费利克斯说的那样,我也认为这里没有实际意义。 – StoryTeller