C 对pte和pte(x)的定义感到困惑

C 对pte和pte(x)的定义感到困惑,c,C,为什么不直接使用“typedef unsigned long pte_t” 为什么这里使用“{}”?看起来很奇怪 我知道如果没有这些,gcc将报告错误。但是,它是如何工作的?我不知道该库,但我敢打赌其目的是防止pte\t和整数类型之间的自动转换 我的意思是,typedef只是一个类型的别名,所以: typedef struct { unsigned long pte; } pte_t; #define __pte(x) ((pte_t) { (x) } ) typedef un

为什么不直接使用“typedef unsigned long pte_t”

为什么这里使用“{}”?看起来很奇怪


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

我不知道该库,但我敢打赌其目的是防止
pte\t
和整数类型之间的自动转换

我的意思是,
typedef
只是一个类型的别名,所以:

typedef struct { unsigned long pte; } pte_t;

#define __pte(x)        ((pte_t) { (x) } )
typedef unsigned long pte_t;

pte_t x = 3; //ok
char y = x; //ok
但结构是一种新类型,因此:

typedef struct { unsigned long pte; } pte_t;

#define __pte(x)        ((pte_t) { (x) } )
typedef unsigned long pte_t;

pte_t x = 3; //ok
char y = x; //ok
然后提供一些函数、宏或任何东西来获取/设置
pte\t
内部字段并完成

更新:好的,我找到了。该库是Linux内核,它的旁边是:

typedef struct { unsigned long pte; } pte_t;

pte_t x = 3; //error!
char y = x; //error!
以访问该值

但仔细看一下,在条件编译代码下,有一个替代定义:

#define pte_val(x)      ((x).pte)
typedef结构{unsigned long pte_low,pte_high;}pte_t;

#定义pte_val(x)((x).pte_low |)((unsigned long)(x).pte_high大括号在语法上是必需的,因为
pte_t
是一个
struct
类型,您不能以任何其他方式初始化成员(
pte_t x=3;
无效,它必须是
pte_t x={3};
)。我只是不能把这个和那个链接起来。无论如何,它可能是作为C99/GNU结构文本使用的,所以你可以在非初始值设定项的地方使用它。然后强制转换是必要的(即
pte_t x;x=__pte(4711);
没有它们就无法工作。