【发布时间】:2016-03-29 08:28:39
【问题描述】:
假设我有a.c 和b.c,它们都定义了称为struct foo 的类型,具有不同的定义:
#include <stdio.h>
struct foo {
int a;
};
int a_func(void) {
struct foo f;
f.a = 4;
printf("%d\n", f.a);
return f.a * 3;
}
#include <stdio.h>
struct foo { // same name, different members
char *p1;
char *p2;
};
void b_func(void) {
struct foo f;
f.p1 = "hello";
f.p2 = "world";
printf("%s %s\n", f.p1, f.p2);
}
在 C 语言中,这些文件是否可以作为符合标准的程序的一部分链接在一起?
(在 C++ 中,我相信这是单一定义规则所禁止的。)
【问题讨论】:
-
当然...只要在任何给定上下文中只有一个定义可见。但是请注意 extern,不要链接到使用与访问它的定义不同的定义创建的对象...
-
正如 dimitri 所说,技术上是的,但我会说这不是理想的编码风格。
-
编码风格没有问题,与extern无关。
-
这里提到“编码风格”的人从来没有做过玩具程序,也不了解编程的基础知识。当你的程序有成百上千个模块,由几十个程序员编写,并与许多库链接时,你当然会出现许多同名的不同类型定义。库中的每个树实现都可能有一个名为
Node的结构。这是正常和好的。外部链接的变量和函数是完全不同的事情,与这个问题无关。 [我在这里的最后评论。] -
@JimBalter 没有人会“向你靠拢”,也没有人说链接器看到了不同的类型定义。关键是,当要从不同的源文件链接外部对象时,有必要确保不同的声明实际上引用相同类型的数据,而不仅仅是相同的类型名称。你显然知道这一点......正如你所说,“这是基本的”......所以我不知道你为什么这么激动。
标签: c struct one-definition-rule