C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用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的C99风格的数组函数签名来最好地调用函数全部内容,希望文章能够帮你解决如何使用C的C99风格的数组函数签名来最好地调用函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。