2017-08-30 48 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