像返回值的宏一样的函数

时间:2013-05-17 07:19:09

标签: c macros

最近遇到了以下示例,这些示例返回一个读取__ret但没有返回语句的寄存器

#define READWORD(offset)       ({ \
                 unsigned short __ret=0;\
                 __ret = readw(offset);\
                 __ret; \
                 })

谷歌是否同样发现像宏这样的功能可以返回值。假设最后一个语句“_ ret”等同于返回一个值是否安全? 如果我在“ _ret”之后有另一个更改__ret值的声明怎么办?哪一个会被退回?

2 个答案:

答案 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值的表达式。所以你可以给它分配一个变量。这使得整个事物在宏观参数中非常稳定。

这有助于解开吗?