V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ivito
V2EX  ›  程序员

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

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

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

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

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

    但是也存在第三种情况,就是这种使用场景下确实不需要判断错误,或者即使判断了也没办法(用了assert等).
    但项目又要求不能有warning,要过lint,这个时候就只能使用这种黑技巧了.
    然后这么奇葩的代码,代码走读时肯定会有人注意到的,解释清楚了,大家都认可这里不需要判断了,就上传罗.
    ivito
        13
    ivito  
    OP
       2015-01-27 18:13:29 +08:00
    @xylophone21 受教了,经常见到直接丢掉函数返回值的情况,一直以为是用不用都行的,这样感觉灵活很多
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:52 · PVG 23:52 · LAX 07:52 · JFK 10:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.