我已经开始在Unix v6上阅读狮子会评论.我偶然发现了这些片段,这些片段在C语言中从未见过.作者确实提供了某种解释,但有人可以向我解释这里发生了什么吗?
params.h :
SW 0177570
......
struct { int integ; };
Run Code Online (Sandbox Code Playgroud)
这用于 unix/prf.c
if(SW->integ == 0)
Run Code Online (Sandbox Code Playgroud)
作者的解释
SW之前定义为值0177570.这是只读处理器寄存器的内核地址,用于存储控制台交换机寄存器的设置.声明的含义很明确:获取位置0177570的内容并查看它们是否为零.问题是用C表达.代码if (SW == 0)不会传达这个含义.显然SW是一个应该被解除引用的指针值.编译器可能已被更改为接受,if (SW-> == 0)但就目前而言,这在语法上是不正确的.通过发明具有元素的虚拟结构,integ程序员已经找到了解决他的问题的令人满意的解决方案.
我的问题主要是这是如何工作的?当编译器看到时SW->integ,它如何SW与匿名结构相关联?
IIRC,古老的C编译器将所有字段名称(例如integ)保存在单个名称空间中,而不是为每种struct类型创建名称空间.它们也没有区分struct指针和int指针,因此每个指针都有一个integ与其第一个sizeof(int)字节相对应的字段.既然integ是a struct和has类型中的第一个值int,则SW->integ对应于*((int *)SW).