为什么我们需要在块宏周围使用括号?

时间:2011-11-15 19:51:06

标签: c gcc linux-kernel

在linux中,container_of宏被包含在看似“额外”的括号中:

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

而不是它,我们可以使用

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

括号是强制性的还是只是为了预防?

2 个答案:

答案 0 :(得分:11)

这是必要的。使用的一个“技巧”是GCC的statement expressions,需要这种“奇怪的”({ code })语法。

使用此宏的代码在大多数用例中都不会编译(并且它不是有效的C)。

另见: Rationale behind the container_of macro in linux/list.h

而且:Greg Kroah-Hartman的container_of

答案 1 :(得分:9)

({...})是一个支撑组,可以在表达式中使用的代码块。最后一个语句决定了它的价值。

在内部宏中,您使用它来让宏的行为与函数相同。 大多数情况下,static inline函数更可取。

相关问题: