C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么在初始化一个函数指针数组时有一个“警告”?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试初始化一个数组的函数指针,我有“警告”: @H_696_2@ring-buffer.c:57:19: warning: assignment from incompatible pointer type [enabled by default] RBufP->rbfunc[0] = &RBufPush; ^

但邻里的确定:

@H_696_2@/*typedef for func pointer*/ typedef RBRetCod_t (*RBFunC)(); /*RBufP*/ typedef struct { RBufSiz_t size; /*size and mask*/ RBufDat_t rbufdat; RBufPoint_t head,tail; RBFunc rbfunc[3]; /*Announce of function pointers array*/ } RBuf_t; RBuf_t *RBufP; ... /*init for func pointers array*/ RBufP->rbfunc[2] = &RBufDel; /*it is ok*/ RBufP->rbfunc[1] = &RBufPull; /*it is ok*/ RBufP->rbfunc[0] = &RBufPush; /*it is bad,why???*/ ... /*body of the functions*/ RBRetCod_t RBufPull(unsigned char *dat) { return RBSUCc; } RBRetCod_t RBufDel(void) { return RBSUCc; } RBRetCod_t RBufPush(unsigned char dat) { return RBSUCc; }

请告诉我为什么在这一行发生警告:RBufP-> rbfunc [0] =& RBufPush,但在相邻的行不存在?

解决方法

请参见C11节6.7.6.3§14,指定何时将两种功能类型视为兼容性:

这是RBufPull和RBufDel的情况,但不会将RBufPush作为unsigned char提升为int.

如果您通过RBFunc类型的指针调用RBuPush,则int参数将被推送到堆栈,而RBufPush将期望一个unsigned char.根据呼叫约定和字节顺序,您将得到不正确的结果.

一个解决方案是更改RBufPush以获取一个int参数.另一个是使用一个演员,即

@H_696_2@RBufP->rbfunc[0] = (RBFunC)&RBufPush;

调用rbfunc [0]之前,需要将其转换为正确的类型RBRetCod_t(*)(unsigned char).

大佬总结

以上是大佬教程为你收集整理的为什么在初始化一个函数指针数组时有一个“警告”?全部内容,希望文章能够帮你解决为什么在初始化一个函数指针数组时有一个“警告”?所遇到的程序开发问题。

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

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