显然在Unix v6中没有定义实例的Struct

时间:2010-08-29 10:30:00

标签: c unix kernel

我将使用Lion的书阅读Unix版本6的代码。其中一个头文件(param.h,可以访问here)定义了以下结构:

/*struct to access integers*/

/*single integer */
struct { int integ; };

/*in bytes*/
struct { char lobyte; char hibyte; };

这些结构似乎没有定义任何实例,也没有命名,因此可以在以后使用。有人知道它们的用途吗?

由于

2 个答案:

答案 0 :(得分:5)

如果有人将整个文件包含在联合声明中,则允许他们访问不同的部分。

这将是:


  union{
   #include <param.h>
  } myparam;

  myparam.integ = 0xDEAD;
  assert(myparam.lobyte == 0xAD)
  assert(myparam.hibyte == 0xDE)

(取决于架构的字节顺序......)

所以看了一下,似乎在旧版本的C中,你不需要声明联合;所有struct / union成员只有一个名称空间,只是转换为可以在任何变量上使用的字节偏移量。我能找到的最好的一点就是: http://docs.sun.com/source/806-3567/compat.html 描述ISO之前的Sun C:  

允许使用成员选择运算符('。',' - &gt;')的结构,联合和算术类型处理其他结构或联合的成员。

答案 1 :(得分:1)

在那些日子里,结构的成员都共享相同的命名空间,而不是每个结构一个命名空间。因此,结构的每个元素必须在所有结构中具有唯一的名称,或者相同的元素必须在它出现的每个结构中的相同偏移处以相同的类型出现。我不确定如何使用它们,但我怀疑你能做到:

int x;

x.lobyte = 1;
x.hibyte = 2;

或类似的东西。

另见:

(但这些似乎都没有回答这个问题。)