在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) );}
括号是强制性的还是只是为了预防?
答案 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
函数更可取。
相关问题: