![](/img/trans.png)
[英]How to call C++ functions with different signatures through function pointer
[英]How to best call functions with C99-style array function signatures from C++
我正在用C ++編寫一些代碼,需要調用用C99編寫的庫。 該庫在其函數參數中使用C99樣式的數組聲明和static
關鍵字。 即,如此:
void my_func(int n, int my_ints[static n]);
但是,在我的C ++項目中包含此庫的標頭時,編譯器(clang)在使用-pedantic
標志時會發出警告:
> g++ -pedantic -c my_code.cpp
In file included from my_code.cpp:
./my_c_lib.h: warning: variable length arrays are a C99 feature [-Wvla-extension]
void my_func(int n, int my_ints[static n]);
在這種情況下,調用C庫的正確/最佳方法是什么? 除了關閉vla-extension
警告之外,還有一些解決方法,不涉及重寫庫的頭文件或編寫中間C包裝器嗎?
最小的工作示例:
extern "C" {
void my_func(int n, int my_ints[static n]);
}
int main()
{
int* some_ints = new int[10];
my_func(10, some_ints);
delete[] some_ints;
return 0;
}
事實上,C ++根本就沒有像C99那樣強大的VLA,它可能永遠不會做; 將VLA納入語言所取得的進步受到嚴格限制,以至於它們幾乎無用。
也就是說,您最好的選擇是為您實際使用的庫函數編寫一些包裝器,這些包裝器會公開該樣式的接口
void my_func_wrap(int n, int* my_ints);
這些將在C99文件中實現,如下所示:
void my_func_wrap(int n, int* my_ints) {
my_func(n, my_ints);
}
C頭和帶有實現的文件都可以從庫頭自動生成,因為更改是瑣碎的。 現在,您可以從C ++代碼中調用包裝器,而不會發生任何類型沖突。
第二種可能的方法是編寫腳本,從庫頭中剝離所有[]
括號的內容,然后使用它。 這將完美地工作,因為即使在C99聲明
void my_func_wrap(int n, int my_ints[static n]);
衰敗成
void my_func_wrap(int n, int* my_ints);
這就是我在上面的包裝函數中不需要任何強制轉換的原因(我知道這聽起來很瘋狂,但這是事實)。 它只是你的C ++編譯器,不喜歡第一個語法變體。
是否有一些方法不涉及重寫庫的標題或編寫中間C包裝?
當然,您可以將整個c標頭括在extern
語句中:
extern "C" {
#include "my_c_lib.h"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.