返回 INT8U 类型的函数调用时加 void 是何用意

2015-01-26 08:42:25 +08:00
 ivito
ucos的OSTaskCreateExt()函数返回值为INT8U,但调用的时候前边加了个void,即 void OSTaskCreateExt(); 不知道这有什么作用呢
3974 次点击
所在节点    程序员
13 条回复
Panic
2015-01-26 09:11:15 +08:00
你来 v2ex 问嵌入式,想多了。。
是官方写法吗,我没搜到在哪void 调用了
scys
2015-01-26 09:17:20 +08:00
感觉是bug
oaix
2015-01-26 09:17:49 +08:00
这不是调用吧,是函数声明。函数声明和实际函数的返回值类型不同在调用的时候没有区别。
jedyu
2015-01-26 09:20:29 +08:00
消除lint?
xylophone21
2015-01-26 10:14:47 +08:00
你确定是
void OSTaskCreateExt();
不是
(void)OSTaskCreateExt();
?
ivito
2015-01-26 12:53:59 +08:00
@Panic ucos源代码OS_CORE.c中的OS_InitTaskIdle函数中调用了
@scys @oaix @jedyu @xylophone21 我打错了,调用的时候用的是(void)OSTaskCreateExt();
denghongcai
2015-01-26 13:59:42 +08:00
没意义,仅仅只是一种编程风格,显式的说明这里不需要返回值而已,去掉也没区别
ivito
2015-01-26 16:28:23 +08:00
@denghongcai 还见过另一种类似的做法,将传入的参数前加(void)&,说是防止编译器warning变量没有使用
denghongcai
2015-01-26 16:34:55 +08:00
@ivito 这样的 warning 其实还是有意义的,很多 lint 工具对会对函数的返回值没有接收者的情况报错,C 灵活也难用。结果到最后 Golang 搞出来了,干脆强制必须要有接收者,即使是个 _ 忽略也得显式的写出来
Shazoo
2015-01-26 16:50:45 +08:00
真亲切……现在用freertos比较多了……

话说这语法就是对返回值进行转义吧。

返回值无接收者,keil,iar的编译器标准参数貌似不会有warning的……
ivito
2015-01-26 20:25:12 +08:00
@denghongcai 强制必须有接收者的话很麻烦啊,写出来感觉也不美观,会有很多多余的代码
@Shazoo 对返回值转义是什么意思,能具体解释一下吗
xylophone21
2015-01-27 10:02:22 +08:00
函数声明为返回int,但你没有处理,一般来说是两种情况:
1.函数声明错了,返回值没啥意义
2.你用错了,没有判断返回值,不严谨

这都是风险,编译器识别出来给个警告很正常.
即使编译器不警告,lint工具也要给警告不是?
这个时候正确的做法应该是修复它.

但是也存在第三种情况,就是这种使用场景下确实不需要判断错误,或者即使判断了也没办法(用了assert等).
但项目又要求不能有warning,要过lint,这个时候就只能使用这种黑技巧了.
然后这么奇葩的代码,代码走读时肯定会有人注意到的,解释清楚了,大家都认可这里不需要判断了,就上传罗.
ivito
2015-01-27 18:13:29 +08:00
@xylophone21 受教了,经常见到直接丢掉函数返回值的情况,一直以为是用不用都行的,这样感觉灵活很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/165438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX