“几年前”实际上是很久很久以前。AFAICR,第 7 版 UNIX™ 中的 C(1979 年,比定义 C89 标准早了十年)不再支持这种表示法(但见下文)。
问题中显示的代码仅在所有结构的所有结构成员共享相同的名称空间时才有效。这意味着structure.integ
或者总是在结构的开头pointer->integ
引用a,因为整个程序中只有一个可能的结构成员。int
integ
请注意,在“现代”C(1978 年以后)中,您不能引用结构类型;它既没有结构标记,也没有 typedef —— 类型是无用的。原始代码还引用了一个未定义的变量c
。
为了使它工作,你需要类似的东西:
#define PTR 0xAA000
struct integ { int integ; };
int func(void)
{
struct integ *ptr = (struct integ *)PTR;
return ptr->integ;
}
C 代表第 7 版 UNIX
我建议第 7 版 UNIX 的 C 支持不同结构类型的独立命名空间。但是,与 UNIX 程序员手册第 2 卷一起发布的 C 参考手册在第 8.5 节结构中提到:
结构成员和结构标记的名称可以与普通变量相同,因为可以通过上下文进行区分。但是,标签和成员的名称必须不同。只有当两个成员的类型相同并且它们的结构起源相同时,相同的成员名称才能出现在不同的结构中;因此,不同的结构可以共享一个共同的初始段。
但是,同一手册还提到了符号(另请参见What does =+
mean in C):
§7.14.2 左值 =+ 表达式
§7.14.3 左值 =- 表达式
§7.14.4 左值 =* 表达式
§7.14.5 左值 =/ 表达式
§7.14.6 左值 =% 表达式
§7.14.7 左值 =>> 表达式
§ 7.14.8 左值 =<< 表达式
§7.14.9 左值 =& 表达式
§7.14.10 左值 =^ 表达式
§7.14.11 左值 = | 表达
''E1 = op E2'' 形式的表达式的行为可以通过将其等同于 ''E1 = E1 op E2'' 来推断;但是,E1 只计算一次。此外,禁止将指针添加到整数的表达式,如“i =+ p”。
AFAICR,我使用的第一个 C 编译器不支持这一点(1983 年——我很古老,但不是那么古老);只允许使用现代+=
符号。换句话说,我不认为该参考手册中描述的 C 在产品发布时是完全最新的。(我还没有检查过我的 K&R 的第 1 版 — 有没有人可以检查?)您可以在http://cm.bell-labs.com/7thEdMan/上在线找到 UNIX 第 7 版手册。