該功能在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