为什么 header include 足以定义?
Why is header including sufficient for definitions?
据我了解; header文件声明事物。现在包括 header 文件,如 #include iostream 包括 header 文件 iostream.h。例如,这告诉编译器“有一个东西叫做:cout”。
问题:编译器如何获得 cout(或所有其他函数)的定义?以我的理解,编译器只知道名称和类型,但不知道定义。
提前致谢。
实际上:不是。它需要知道 如何 object 看起来像什么,它们提供什么接口(所以对于 std::cout
那是一些 std::ostream
流 object, 显然是) 的一个子类,并且这样的 objects do 存在 某处 。就是这样。编译器然后为该 object 添加占位符——就像它为函数调用所做的那样。
编译之后还有第二个单元:链接器。顾名思义,它将所有这些编译单元链接在一起。如果它现在看到这样的占位符,它将用 object 或函数的地址替换它——当然,它必须存在(对于 std::cout
,extern
声明在 header,但是一些其他源文件必须在没有extern
的情况下实现它——如果pre-compiled在一些库),否则会引发链接器错误。
据我了解; header文件声明事物。现在包括 header 文件,如 #include iostream 包括 header 文件 iostream.h。例如,这告诉编译器“有一个东西叫做:cout”。 问题:编译器如何获得 cout(或所有其他函数)的定义?以我的理解,编译器只知道名称和类型,但不知道定义。 提前致谢。
实际上:不是。它需要知道 如何 object 看起来像什么,它们提供什么接口(所以对于 std::cout
那是一些 std::ostream
流 object, 显然是) 的一个子类,并且这样的 objects do 存在 某处 。就是这样。编译器然后为该 object 添加占位符——就像它为函数调用所做的那样。
编译之后还有第二个单元:链接器。顾名思义,它将所有这些编译单元链接在一起。如果它现在看到这样的占位符,它将用 object 或函数的地址替换它——当然,它必须存在(对于 std::cout
,extern
声明在 header,但是一些其他源文件必须在没有extern
的情况下实现它——如果pre-compiled在一些库),否则会引发链接器错误。