我在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编译器不喜欢第一个语法变体.