Cpp基础入门(编译与链接)(仅记录与Java不同之处)

C++如何工作

  • #后是预处理文件
  • include<>内是头文件,引入函数
  • 每一个源代码有一个obj文件,bulid会用链接将它们合为一个exe文件

编译器如何工作

在Cpp中,文件只是提供给编译器源代码的一种方式FIles have no meaning
每一个cpp文件都是一个翻译单元,且都会生成一个目标文件(obj)
obj文件中会包含引入的库,这将增大内存

预处理

预处理时会将预处理文件遍历一遍
Cpp基础入门(编译与链接)(仅记录与Java不同之处)_第1张图片
上图文件可以运行,以为头文件EndBrace中包含一个**“}”**

Cpp基础入门(编译与链接)(仅记录与Java不同之处)_第2张图片

Link

  • entry不一定要是main方法,可以自行定义,但main是默认
  • error : unresolved external symbol(链接器找不到对应文件)
  • 一个非静态函数被声明,但没有被调用,链接器仍会去 尝试连接函数(如果被调用时)需要连接的部分。
  • 但如果是一个静态函数(这意味这它只在所在的一个翻译单元中被调用),且在这个文件中最终没有被调用,那么链接器不会尝试链接函数中所调用的内容

Cpp基础入门(编译与链接)(仅记录与Java不同之处)_第3张图片
上图:当对这个文件编译时,不会产生错误。但当对files使用builds,会有链接错误(已经存在一个log.cpp(其中复制了log的函数体),这会使得链接器不知道连接哪个函数体)

Cpp基础入门(编译与链接)(仅记录与Java不同之处)_第4张图片
log.h中有log的函数体,并且log.cpp和math.cpp中都有#include “log.h”

  • hit build,then there will be a link error:这是因为预处理文件会在include的位置引入整个头文件,这将会使log.cpp和Math.cpp中都包含一个log函数体,从而导致错误
  • 解决方法:
  1. inline函数(在被调用时自动化为函数体,而不是进行函数的调用)
  2. static(只在一个翻译单元中被调用)
  3. 将log.h中函数体去除,保留声明。并在log.cpp or Math.cpp中进行函数体的补充(此时不能为static以保证可以被其他翻译单元调用)

你可能感兴趣的:(开发语言,c++)