mgh*_*his 1 c gcc struct pointers ansi
几年前,在C标准化之前,允许在地址上使用结构选择器.例如,允许并经常使用以下代码.
#define PTR 0xAA000
struct { int integ; };
func() {
int i;
i = PTR->integ; /* here, c is set to the first int at PTR */
return c;
}
Run Code Online (Sandbox Code Playgroud)
也许它不是很整洁,但我喜欢它.在我看来,这种语言的力量和多样性也依赖于它缺乏约束.如今,编译器只是转储错误.我想知道是否可以在GNU C编译器中删除此约束.
PS:C发明人在UNIX内核上使用了类似的代码(在V6中,已经在param.h中声明了一些虚拟结构)
"几年前"实际上是很久很久以前的事了.AFAICR,第7版UNIX™中的C(1979年,定义了C89标准之前的十年)不再支持这种表示法(但见下文).
只有当所有结构的所有结构成员共享相同的名称空间时,问题中显示的代码才有效.这意味着structure.integ
或者pointer->integ
总是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;
}
Run Code Online (Sandbox Code Playgroud)
我建议使用第7版UNIX的C支持单独的结构类型的单独命名空间.但是,随UNIX程序员手册第2卷一起发布的C参考手册在§8.5结构中提到:
结构成员和结构标签的名称可以与普通变量相同,因为可以通过上下文进行区分.但是,标签和成员的名称必须是不同的.只有当两个成员属于同一类型并且它们的结构相对于它们的结构相同时,相同的成员名称才能出现在不同的结构中; 因此,单独的结构可以共享共同的初始段.
§7.14.2左值= +表达
§7.14.3左值= -表达
§7.14.4左值=*表达
§7.14.5左值= /表达
§7.14.6左值=%表达
§7.14.7左值= >>表达
§ 7.14.8 lvalue = <<表达式
§7.14.9lvalue=&expression§7.14.10lvalue
= ^expression§7.14.11lvalue
= | 表达形式为''E1 = op E2''的表达式的行为可以通过将其等同于''E1 = E1 op E2''来推断; 但是,E1仅评估一次.此外,禁止将指针添加到整数的"i = + p"这样的表达式.
AFAICR,我使用的第一个C编译器不支持(1983年 - 我很古老,但不是很古老); 只+=
允许使用现代符号.换句话说,我不认为该产品发布时该参考手册中描述的C是完全最新的.(我没有查看我的第1版K&R - 有没有人可以查看?)您可以在http://cm.bell-labs.com/7thEdMan/在线找到UNIX第7版手册.