据我了解;头文件声明事物。现在包含头文件,如 #include iostream 包含头文件 iostream.h。例如,这告诉编译器“有一个叫做:cout”的东西。 问题:编译器如何获取 cout(或所有其他函数)的定义?根据我的理解,编译器只知道名称和类型,但不知道定义。
事实上:事实并非如此。它需要知道对象的如何,它们提供什么接口(因此对于
std::cout
来说,这是一个std::ostream
流对象,显然是其子类)以及此类对象do存在于某处。就是这样。然后编译器所做的就是为该对象添加占位符 - 就像函数调用一样。
编译后还有第二个单元:链接器。正如其名称所示,它将所有这些编译单元链接在一起。如果它现在看到这样的占位符,它将用对象或函数的地址替换它——当然,它必须存在(对于
std::cout
,标头中有一个 extern
声明,但是 some 其他源文件必须在没有extern
的情况下实现它——并且如果在某些库中预编译),否则会出现链接器错误扔了。