例一
例如:sock结构体,定义了很多这种宏,嵌套了一层的宏定义来引用__sk_common里的成员。
struct sock {
struct sock_common __sk_common;
#define sk_node __sk_common.skc_node
#define sk_nulls_node __sk_common.skc_nulls_node
#define sk_refcnt __sk_common.skc_refcnt
定义在结构体里的原因是:
- 表明这个宏定义,只是对这个结构体使用才有意义。
- 只有定义了__sk_common这个成员之后,这个宏才能使用。
具体的宏是没有作用域之说,当undef之后,宏就失去了定义;或者超出当前编译单元,宏也失去了定义。
例二:
struct fib6_table {
struct hlist_node tb6_hlist;
u32 tb6_id;
spinlock_t tb6_lock;
struct fib6_node tb6_root;
struct inet_peer_base tb6_peers;
unsigned int flags;
unsigned int fib_seq;
#define RT6_TABLE_HAS_DFLT_ROUTER BIT(0)
};
表明这个宏定义和这个结构体 强关联,方便理解和看代码。其实放在外面也是可以的。
|