0

我在阅读 linux 源代码时发现了一些奇怪的语法。container_of 宏看起来像

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

让我感到困惑的是像 ({statement1; statement2;}) 这样的语法

我尝试了一些简单的代码,例如

int a = {1;2;};

我用 gcc 编译它。运行后,'a' 似乎是 2。但它无法用 Microsoft VC++ 编译。这种语法是 gcc 的扩展功能吗?如果是这样,我怎样才能在没有 gcc 扩展的情况下获得相同的效果,比如定义多个语句并使用宏返回一个值?

4

1 回答 1

2

({...})语法是 GCC 扩展,称为语句表达式

typeof是另一个 GCC 扩展。

这两个扩展都在其他一些编译器中可用,例如LLVM/Clang(或 TinyCC)。

Linux 内核经常使用它们。

要避免它们是相当困难的。如果你真的想要,你可能会考虑(这是一项不平凡的任务),从GIMPLE转换回低级、不可移植和不可读的 C。你可以使用MELT(部分工作在melt/xtramelt-c-generator.meltJ.Salvucci的文件)。

于 2013-07-17T13:51:45.957 回答