C++编译流程

Edu*_*yan 2 c++ linker templates compilation

请考虑以下代码:

//header.h
#pragma once

class A
{
public:
    A();
    void f();
};

//header.cpp   
#include "header.h"

A::A(){}
void A::f(){}

//main.cpp
#include "header.h"  

int main()
{
    A a;
    a.f();
}
Run Code Online (Sandbox Code Playgroud)

那么编译器如何知道constructorf函数的声明究竟在哪里,因为只有header.hin包含在main.cpp?为什么它在class A模板时找不到相同的功能?

小智 6

让我告诉你这个图像: c ++ flow http://faculty.cs.niu.edu/~mcmahon/CS241/Images/compile.png

编译过程如下所示:

  1. C++预处理器将包含的头文件的内容复制到源代码文件中,生成宏代码,并将使用#define定义的符号常量替换为其值.

  2. 由C++预处理器生成的扩展源代码文件被编译为平台的汇编语言.

  3. 编译器生成的汇编代码被汇编到平台的目标代码中.

  4. 汇编程序生成的目标代码文件与用于生成可执行文件的任何库函数的目标代码文件链接在一起.