|
|
1
1
编译程序 编译 每个源文件都是分开的。它信任给定的类声明对于所有源文件都是相同的。 当您执行上述操作时,您将诱使编译器为某些类编译两个具有两个不同定义的文件。每个文件生成一段自一致的代码。 然后链接器进来 链接 你各种各样的代码在一起。有一种对象/库格式,可以在所有编译器之间共享。这是为了允许每个链接器与每个编译器一起工作。此时,链接器只知道一些代码将通过 福 对象和其他一些代码将接收 福 对象。偷看、检查、抱怨都不关它的事。 请记住,在链接时,源代码甚至可能不可用。您可能有某个供应商的库,但没有源代码。可能有各种定义会影响这个对象。链接器不需要知道编译设置是什么,甚至不需要知道源是什么。代码甚至可以用另一种语言编写。 要获得这种灵活性和互操作性,必须遵循一些规则。其中之一是“不要用不同的方式定义同一个类两次”。 |
|
|
2
2
是的,这违反了一个定义规则的“头版本”。在这个版本中,它适用于类定义,
在大多数C++实现中,编译器将翻译单元转换为包含函数代码和符号定义的对象文件,并且函数代码可以使用其他对象定义的其他“未定义符号”。就对象文件而言,除了调试器数据之外,几乎没有保存关于C++源或类型信息的内容。链接器可能只看到该函数
(当对象文件不同意与符号关联的字节数时,链接器有时会发出警告,但指向类类型对象的两个指针的大小可能相同。) |