c中的奇怪宏,使用多个语句

时间:2013-07-17 13:41:16

标签: c linux gcc macros

我在阅读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扩展的情况下获得相同的效果,比如定义多个语句并使用宏返回一个值?

1 个答案:

答案 0 :(得分:2)

({ ... })语法是GCC扩展名,名为statement expressions

typeof是另一个GCC扩展。

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

Linux内核经常使用它们。

要避免它们是非常困难的。如果你真的想要,你可能会考虑(这是一项非常重要的任务),从GIMPLE转换回低级,非便携且不可读的C.你可以使用MELT (部分工作由J.Salvucci在其文件melt/xtramelt-c-generator.melt中完成)。