C 对pte和pte(x)的定义感到困惑
为什么不直接使用“typedef unsigned long pte_t” 为什么这里使用“{}”?看起来很奇怪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
我知道如果没有这些,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);
没有它们就无法工作。