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

在看 Linux 中 vsprintf() 源码时,发现似乎程序块也可以有值的?

  •  1
     
  •   thinkIn · 2015-10-13 09:15:04 +08:00 · 1326 次点击
    这是一个创建于 3111 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # define do_div(n, base) ({                     \
        unsigned int __base = (base);               \
        unsigned int __rem;                         \
        __rem = ((unsigned long long)(n)) % __base; \
        (n) = ((unsigned long long)(n)) / __base;   \
        __rem;                                      \
    })
    
    .......
    tmp[i++] = digits[do_div(num, base)];
    ...........
    

    do_div(n,base)的值是_rem?

    第 1 条附言  ·  2015-10-13 10:07:44 +08:00
    9 条回复    2015-10-13 12:53:02 +08:00
    loveyu
        1
    loveyu  
       2015-10-13 09:19:53 +08:00
    这个只是宏定义而已,不是函数
    wizardoz
        2
    wizardoz  
       2015-10-13 09:22:13 +08:00
    可以的, C 语言的参考书中很容易找到说明。但是这种用法有点晦涩,而且感觉不是十分必要,所以我从来没有用过。
    ooxxcc
        3
    ooxxcc  
       2015-10-13 09:32:36 +08:00
    楼上的没仔细看……

    似乎返回的是最后一句的返回值?
    ooxxcc
        4
    ooxxcc  
       2015-10-13 09:32:48 +08:00
    楼上指一楼
    thinkIn
        5
    thinkIn  
    OP
       2015-10-13 09:47:27 +08:00
    找到资料了
    http://stackoverflow.com/questions/7117427/c-block-becomes-expression-int-a-1-int-b-2-ab-equals-3
    有评论说 ” This is a GCC extension called Statement Expressions. It's not standard C.“

    这不是标准 C 的语法。
    zonghua
        6
    zonghua  
       2015-10-13 10:44:27 +08:00
    @thinkIn unbelievable
    firemiles
        7
    firemiles  
       2015-10-13 10:50:15 +08:00
    还以为可以像 ruby 一样,所有语句都有返回值,这样就能用宏写一些函数了
    starp128
        8
    starp128  
       2015-10-13 12:33:01 +08:00
    词法分析时由程序块的对应的规则决定它的值。
    pright
        9
    pright  
       2015-10-13 12:53:02 +08:00
    嗯, GCC 的扩展语法,能实现出更像函数表现的宏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4306 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:06 · PVG 12:06 · LAX 21:06 · JFK 00:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.