如何使用C的C99风格的数组函数签名来最好地调用函数
发布时间:2020-12-16 06:04:40 所属栏目:百科 来源:网络整理
导读:我在C中编写一些代码,需要调用C99编写的库.该库在其函数参数中使用C99风格的数组声明和static关键字.也就是说: void my_func(int n,int my_ints[static n]); 但是,当我的C项目中包含这个库的头文件时,编译器(clang)会在使用-pedantic标志时引发警告: g++ -
我在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编译器不喜欢第一个语法变体. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |