最近遇到了以下示例,这些示例返回一个读取__ret但没有返回语句的寄存器
#define READWORD(offset) ({ \
unsigned short __ret=0;\
__ret = readw(offset);\
__ret; \
})
谷歌是否同样发现像宏这样的功能可以返回值。假设最后一个语句“_ ret”等同于返回一个值是否安全? 如果我在“ _ret”之后有另一个更改__ret值的声明怎么办?哪一个会被退回?
答案 0 :(得分:8)
这是使用名为Statement Expressions的GCC扩展程序。
您可以使用它,除非您需要移植到GCC(和Clang / LLVM)以外的编译器。
答案 1 :(得分:3)
让我们打破这个。例如,让我们看看READWORD(1)将会做什么。预处理器将插入此: ( { unsigned short __ret = 0; __ret = readw(1); __ret; } )
现在我们可以看到它的作用。我们只是使用参数(1)调用函数readw并将其分配给unsigned short。之后我们只有__ret行;虽然它是一个完全有效的陈述,但它似乎没有任何作用。但请继续阅读!
最终结束后,一切都超出了范围。
但是,封闭的()会产生重大影响。优雅地,整个事物是一个具有__ret值的表达式。所以你可以给它分配一个变量。这使得整个事物在宏观参数中非常稳定。
这有助于解开吗?