4

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

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

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

4

2 回答 2

8

这是使用一个名为Statement Expressions的 GCC 扩展。

您可以使用它,除非您需要移植到 GCC(和 Clang/LLVM)以外的编译器。

于 2013-05-17T07:24:28.647 回答
3

让我们分解一下。例如,让我们看看 READWORD(1) 会做什么。预处理器将插入: ( { unsigned short __ret=0; __ret = readw(1); __ret; } )

现在我们可以看到它在做什么了。我们只是调用一个带有参数 (1) 的函数 readw 并将其分配给一个无符号的 short。之后我们只有 __ret; 行。尽管这是一个完全有效的陈述,但它似乎并没有做任何事情。但请继续阅读!

在最后的}之后,一切都超出了范围。

但是,封闭的 () 使一切变得不同。整个事情优雅地是一个具有 __ret 值的表达式。因此,您可以为其分配一个变量。这使得整个事情在宏观参数中非常稳定。

这有助于解压吗?

于 2013-05-17T07:26:42.987 回答