【发布时间】:2014-01-29 09:11:52
【问题描述】:
在下面的伪代码中:
#include<stdio.h>
typedef struct _apple
{
int a;
char b;
float c;
} apple;
typedef struct _orange
{
int a;
int b;
} orange;
typedef struct _grape
{
int a;
} grape;
void main()
{
apple a1;
orange o1;
a1.a =1;
a1.b =2;
a1.c =3;
o1.a =4;
void * fruit[] = {&a1, &o1};
grape *app = (grape*)fruit[0];
printf ("\nRead: %d ", app->a);
app = (grape*)fruit[1];
printf ("\nRead: %d ", app->a);
}
葡萄结构是苹果和橙子的子集,因为它包含的元素顺序与苹果和橙子中的顺序相同。该程序给出的预期输出为 1 和 4。但是这种方法是否有可能因不同的编译器或任何其他特定于环境的更改而失败?
【问题讨论】:
-
这真是一个可怕的想法 - 为您的公共结构字段使用联合。
-
旁注:完全可以写:
typedef struct something {...} something;。即,您不需要为结构指定与typedefed 名称不同的名称(如_orange与orange)。 -
我不完全确定,但是如果不使用结构的成员,一些卑鄙的编译器可能会“优化”掉它们......
-
不仅可以在全局范围内使用以下划线开头的标识符重用相同的名称(如@Shahbaz 所提到的),这是一个禁忌。这样的标识符是为编译器保留的。
-
@Shahbaz,这与头文件无关,限制适用于文件范围内的所有此类标识符,措辞对我来说一点也不含糊。这种限制的原因是允许编译器在内部使用任何此类标识符并用于链接目的。
标签: c pointers struct dereference