加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用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编译器不喜欢第一个语法变体.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读