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

2015-10-13 09:15:04 +08:00
 thinkIn
# 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?

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

似乎返回的是最后一句的返回值?
ooxxcc
2015-10-13 09:32:48 +08:00
楼上指一楼
thinkIn
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
2015-10-13 10:44:27 +08:00
@thinkIn unbelievable
firemiles
2015-10-13 10:50:15 +08:00
还以为可以像 ruby 一样,所有语句都有返回值,这样就能用宏写一些函数了
starp128
2015-10-13 12:33:01 +08:00
词法分析时由程序块的对应的规则决定它的值。
pright
2015-10-13 12:53:02 +08:00
嗯, GCC 的扩展语法,能实现出更像函数表现的宏

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

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

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

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

© 2021 V2EX