作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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))
看到了吗?根据配置的不同,可能只有一个字段或多个字段。从单一类型更改为结构将是疯狂的。所以它总是被定义为一个结构。
关于对 pte_t 和 __pte(x) 的定义感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26272968/
typedef struct { unsigned long pte; } pte_t; #define __pte(x) ((pte_t) { (x) } ) 为什么不直接使用'typ
我是一名优秀的程序员,十分优秀!