typedef struct { unsigned long pte; } pte_t;
#define __pte(x) ((pte_t) { (x) } )
为什么不直接使用'typedef unsigned long pte_t'?
为什么在这里使用'{}'?看起来很奇怪。
我知道没有那些gcc会报告错误。但是,它是如何工作的?
答案 0 :(得分:2)
我不知道图书馆,但我敢打赌,目的是阻止pte_t
和整数类型之间的自动转换。
我的意思是,typedef
只是一个类型的别名,所以:
typedef unsigned long pte_t;
pte_t x = 3; //ok
char y = x; //ok
但结构是一种新类型,所以:
typedef struct { unsigned long pte; } pte_t;
pte_t x = 3; //error!
char y = x; //error!
然后提供一些函数,宏或其他来获取/设置pte_t
内部字段,并完成。
更新:好的,我找到了。 库是Linux内核,紧挨着它:
#define pte_val(x) ((x).pte)
访问该值。
但是看一下它,在有条件编译的代码下,有另一个定义:
typedef struct { unsigned long pte_low, pte_high; } pte_t;
#define pte_val(x) ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
请参阅?根据配置,可能只有一个字段或几个字段。从单一类型转换为结构将是疯狂的。所以它总是被定义为结构。