2010-10-07 27 views
9

我已经开始阅读Unix v6上的狮子会评论。我遇到了这些我从未见过的C语言片断。作者确实提供了某种解释,但有人可以向我解释这里发生了什么?C中的匿名结构在Unix内核中找到

params.h

SW 0177570 
...... 
struct { int integ; }; 

和由作者

SWunix/prf.c

if(SW->integ == 0) 

说明此使用的作为值前所定义 0177570.这是内核地址的 只读处理器寄存器,用于存储控制台切换寄存器的 设置。 该声明的含义是明确的:获取位置0177570处的 内容并查看它们是否为 为零。问题是在 C中表示这个。代码if (SW == 0)不会传达这个意思。很明显, SW是一个指针值,应该是 解除引用。编译器可能已被 更改为接受 if (SW-> == 0) 但按照现状,这在语法上不正确。通过发明一个虚拟结构, 一个元素integ,程序员找到了一个令人满意的解决方案,他的问题是 。

我的问题主要是如何工作?当编译器看到SW->integ时,它如何将SW与匿名结构关联?

回答

6

IIRC古代C编译器将所有字段名称(如integ)保存在一个名称空间中,而不是根据struct类型创建名称空间。他们也没有区分struct指针和int指针,因此每个指针都有一个对应于其第一个sizeof(int)字节的integ字段。由于integstruct中的第一个值,并且类型为int,因此SW->integ对应于*((int *)SW)

+2

在现代C中,我们使用'int * const SW = 0177570;'但是在优化器出现之前,这会让Ken和他的成本花费两个字节:) – 2010-10-07 11:42:01