我最近发现了这个GCC宏:
#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)
在我看到这段代码之前我没有意识到,一段代码{...}可以某种方式在C中返回值
.1)你能给我一个暗示它是如何工作的吗?
虽然,我通常可以通过滥用逗号运算符来实现相同的结果:
#define max(a,b) \
(typeof (a) _a = (a), \
typeof (b) _b = (b), \
(_a > _b ? _a : _b))
Run Code Online (Sandbox Code Playgroud)
或者如果只是为了副作用,我会使用 do { ... } while(0)
2)这样做的首选方式是什么?
最近遇到了以下示例,这些示例返回一个寄存器读取__ret但没有返回语句
#define READWORD(offset) ({ \
unsigned short __ret=0;\
__ret = readw(offset);\
__ret; \
})
Run Code Online (Sandbox Code Playgroud)
谷歌是否同样发现像宏这样的功能可以返回值.假设最后一个语句"_ ret"等同于返回一个值是否安全?如果我在" _ret" 之后有另一个更改__ret值的声明怎么办?哪一个会被退回?