簡體   English   中英

如何使用C ++中的C99樣式數組函數簽名來最佳地調用函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM