V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
snowonion
V2EX  ›  Linux

看到 Linux 内核 Git 仓库的一个 Pull Request, 修正了一个漏分号的错误

  •  
  •   snowonion · 2014-08-01 17:26:05 +08:00 · 4230 次点击
    这是一个创建于 3797 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://github.com/torvalds/linux/pull/84/files

    ↑ 原先的代码应该是会出编译错误吧? 为什么有编译错误的代码会进入仓库呢...

    是不是 Mr. Torvalds 他们对代码的检查是周期性进行的, 而非 merge 每个 Pull Request 时都会检查?
    第 1 条附言  ·  2014-12-04 17:31:35 +08:00
    结论:
    list_for_each 是个宏。根据它的展开内容,加分号是不必要的。所以那个 Pull Request 是不必要的。
    13 条回复    2014-08-10 10:16:39 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2014-08-01 17:40:45 +08:00 via Android   ❤️ 1
    有可能是git merge导致的错误,有些时候git merge时会导致一些莫名其妙的错误
    ChiangDi
        2
    ChiangDi  
       2014-08-01 17:45:08 +08:00
    这也行,真是惊呆了,他们不测试就提交的?
    akfish
        3
    akfish  
       2014-08-01 17:46:04 +08:00
    看下blame不就知道了
    dorentus
        4
    dorentus  
       2014-08-01 17:48:16 +08:00   ❤️ 1
    编译错误一般来说不是人工检查的重点,大都是用自动化的系统来检查的吧,一般是异步的。

    然后 Linux 项目并不使用 Github 的 Pull Request 功能: https://github.com/torvalds/linux/pull/17#issuecomment-5654674
    akfish
        6
    akfish  
       2014-08-01 17:59:09 +08:00   ❤️ 3
    其实我想吐槽的是这不是bug。。。。
    list_for_each并不是函数调用,而是一个宏
    https://github.com/torvalds/linux/blob/164c09978cebebd8b5fc198e9243777dbaecdfa0/drivers/staging/usbip/userspace/libsrc/list.h#L110
    dorentus
        7
    dorentus  
       2014-08-01 17:59:09 +08:00   ❤️ 1
    仔细看了下,这 Pull Request 不对……

    list_for_each 大概是个宏,用法类似 for 或者 foreach:

    例如 https://github.com/torvalds/linux/blob/164c09978cebebd8b5fc198e9243777dbaecdfa0/drivers/usb/mon/mon_main.c:

    list_for_each (p, &mon_buses) {
    struct mon_bus *m1;
    m1 = list_entry(p, struct mon_bus, bus_link);
    m1->u_bus->monitored = 1;
    }

    Pull Request 里面的下一行明显有个锁进,所以只是类似单行 for 省略了大括号而已;加了分号之后,即使不会报错,语义也变了。
    fo2w
        8
    fo2w  
       2014-08-01 18:05:22 +08:00   ❤️ 1
    从代码和conversation看这不是个bug, 而且是编的过的啊
    这展开仅仅是个for循环而且下一行就是循环体snd_usbmidi_disconnect(midi);
    还专门缩进了用来提醒!
    就这么贸然加个分号, 让循环体怎么想.....
    limon
        9
    limon  
       2014-08-01 19:00:17 +08:00
    在c里xxx_for_each这种命名明显就是宏嘛。。。
    snowonion
        10
    snowonion  
    OP
       2014-08-03 12:43:36 +08:00
    谢谢各位~
    跟 C 语言不熟, 没想到宏这回事=.=

    如果不是
    #define list_for_each(pos, head)
    而是
    #define list_for_each(pos, head):
    会不会有助于避免误解 ( ゚∀。)
    zoudm
        11
    zoudm  
       2014-08-04 10:10:43 +08:00   ❤️ 1
    @snowonion

    C里面目测不这样用 [:] 。。。

    看着真像python。。
    Youmu
        12
    Youmu  
       2014-08-09 08:50:51 +08:00   ❤️ 1
    @snowonion 这个编译就会出错呀,宏替换的时候不会替换那多余的`:'的。
    snowonion
        13
    snowonion  
    OP
       2014-08-10 10:16:39 +08:00
    @Youmu 多谢~ 窝又没试就口胡啦_(:3」∠)_
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2998 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:10 · PVG 22:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.