对pte_t和__pte(x)的定义感到困惑

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))

看到?根据配置,可能只有一个字段或几个字段.从单一类型转换为结构将是疯狂的.因此它始终定义为结构.

点赞