【发布时间】:2014-09-26 00:03:30
【问题描述】:
我在this 页面上阅读了有关 C 中的类型提升的信息,并发现了有关 struct/union/enum 的更多信息:
6.12.2 单独编译兼容性
由于每次编译可能会查看不同的源文件,因此大多数 跨不同编译的兼容类型的规则是 结构性:
匹配的标量(整数、浮点和指针)类型必须是 兼容,就好像它们在同一个源文件中一样。
匹配的结构、联合和枚举必须具有相同数量的 成员。每个匹配的成员必须有一个兼容的类型(在 单独的编译意义),包括位域宽度。
匹配的结构必须具有相同顺序的成员。命令 union 和 enum 成员的数量无关紧要。
匹配的枚举成员必须具有相同的值。
另一个要求是成员的姓名,包括 未命名成员缺少名称,结构匹配,联合,以及 枚举,但不一定是它们各自的标签。
我的问题:结构“等于”在什么意义上?在哪里以及为什么可以使用它?谁能给个代码示例?
显然,如果没有强制转换,下面的代码不会在没有警告的情况下编译。而且由于 C 不是一种强类型语言,它可以与任何 种类 的结构一起使用。所以我真的不知道它在哪里有用;
struct foo_t
{
int a;
int b;
};
struct baa_t
{
int a;
int b;
};
void print(struct foo_t*);
int main(void)
{
struct foo_t a = {1,2};
struct baa_t b = {3,4};
print(&a);
print(&b); //cast needed
return 0;
}
void print(struct foo_t *f)
{
printf("a = %d\r\n", f->a);
printf("b = %d\r\n", f->b);
}
【问题讨论】:
-
C 不是强类型的?
-
@mafso 强类型可以 mean many different things 但它通常与 static 类型不同,您现在可能正在考虑这种类型。
-
@mafso:是的。任何指针都会转换为其他指针类型,只需强制转换即可。
-
好吧,指针转换是一个显式请求忽略静态类型(并且需要因为 C是强类型),至少,我如何理解这个词。但是,是的,我看到了定义问题……我只是在结合代码时有点困惑(这是一个由于类型不匹配而无法工作的示例,所以至少它不是 C 被弱类型化的示例)。