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

时间:2014-10-09 07:46:07

标签: c

typedef struct { unsigned long pte; } pte_t;

#define __pte(x)        ((pte_t) { (x) } )

为什么不直接使用'typedef unsigned long pte_t'?

为什么在这里使用'{}'?看起来很奇怪。

我知道没有那些gcc会报告错误。但是,它是如何工作的?

1 个答案:

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

请参阅?根据配置,可能只有一个字段或几个字段。从单一类型转换为结构将是疯狂的。所以它总是被定义为结构。