我不理解编译器如果知道如果他们使用预编译库会怎么做。例如,假设我的程序是
#include <vector>
#include <iostream>
int main()
{
std::vector<int> V = {1, 69, 111};
for (std::vector<int>::iterator it(V.begin()), offend(V.end()); it != offend; ++it)
std::cout << *it << std::endl;
return 0;
}
显然std::vector
对于这个简单的程序来说太过分了。但编译器如何知道,除非它知道如何用C ++语言实现std::vector
?
答案 0 :(得分:3)
可能没有&#34;预编译的二进制文件&#34;参与你的例子。但是,您使用的是standard C++ library(提供cout
上的操作和<vector>
之类的标题;阅读有关软件libraries的更多信息(实际上,Linux上的libstdc++.so
共享库是以编译的二进制形式)。
你有一个#include <vector>
然后你正在使用std::vector<int>
实现C++ template,所以编译器正在定义一些类&amp;函数(std::vector<int>
所需)并发出相关代码。
详细了解compilers和linkers,例如Levine's book on Linkers & loaders; GCC的文档也有一章template instantiation
顺便说一下,您可以查看程序的preprocessed形式(假设在文件yoursource.cc
中)。如果使用 GCC 使用
g++ -Wall -C -E yoursource.cc > yoursource.ii
编译该源代码,那么使用编辑器或寻呼机查看(非常大的)yoursource.ii
生成的文件,这是相当的类似于编译器实际上&#34;看到&#34;
答案 1 :(得分:1)
我的猜测是你在想precompiled headers。库包含一组先前已编译或汇编的目标文件。如上所述,模板是一种源代码形式,包含在标题中。