我在阅读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扩展的情况下获得相同的效果,比如定义多个语句并使用宏返回一个值?
答案 0 :(得分:2)
({
... })
语法是GCC扩展名,名为statement expressions。
typeof是另一个GCC扩展。
其他一些编译器都可以使用这两种扩展,例如LLVM/Clang(或TinyCC)。
Linux内核经常使用它们。
要避免它们是非常困难的。如果你真的想要,你可能会考虑(这是一项非常重要的任务),从GIMPLE转换回低级,非便携且不可读的C.你可以使用MELT (部分工作由J.Salvucci在其文件melt/xtramelt-c-generator.melt
中完成)。