如何使用C的C99风格的数组函数签名来最好地调用函数

前端之家收集整理的这篇文章主要介绍了如何使用C的C99风格的数组函数签名来最好地调用函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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扩展警告外,还有一些方法不涉及重写库的头文件或编写中间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++相关文章