typedef struct { unsigned long pte; } pte_t;
#define __pte(x) ((pte_t) { (x) } )
为什么不直接使用’typedef unsigned long pte_t’?
为什么在这里使用“{}”?看起来很奇怪.
我知道没有那些gcc会报告错误.但是,它是如何工作的?
最佳答案 我不知道库,但我敢打赌,目的是阻止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))
看到?根据配置,可能只有一个字段或几个字段.从单一类型转换为结构将是疯狂的.因此它始终定义为结构.