【发布时间】:2020-02-05 23:13:17
【问题描述】:
在 C 和 C++ 中,您不能拥有具有两个定义的函数。例如,假设我们有以下两个文件:
1.c:
int main(){ return 0}
2.c:
int main(){ return 0}
发出命令gcc 1.c 2.c 会给你一个duplicate symbol 链接器错误。
为什么结构和类不会发生同样的情况?为什么我们可以拥有多个
相同结构的定义,只要它们具有相同的标记?
【问题讨论】:
-
class/struct定义不是函数。它们是类型。 ODR 规则适用于函数和对象,而不是类型。 -
但是为什么呢?您何时希望在另一个文件中具有相同的类定义?头文件不是用来做那个的吗?
-
你认为头文件在做什么?
#include指令读取文件并复制整个内容 直接在该指令的位置。通过使用头文件,您可以在includes 这个头文件的每个文件中获得这个结构定义的副本。 -
@Josh 这些是(成员)函数定义。 类定义是在
class/struct关键字和名称之后的{};之间的部分。 -
关键是它是一个链接器错误。 C 编译器并非旨在成为“整个程序”编译器。它旨在分别编译每个“翻译单元”(即
.c文件)。所以编译器在编译2.c时不会“记住”main是在1.c中定义的。并且链接器没有看到main的源代码,所以它不知道这两个定义是相同的。所以如果链接器看到重复的符号,它会抛出一个错误。
标签: c++ c one-definition-rule