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

发布时间:2024年01月06日

C++如何工作

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

编译器如何工作

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

预处理

预处理时会将预处理文件遍历一遍
在这里插入图片描述
上图文件可以运行,以为头文件EndBrace中包含一个**“}”**

在这里插入图片描述

Link

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

在这里插入图片描述
上图:当对这个文件编译时,不会产生错误。但当对files使用builds,会有链接错误(已经存在一个log.cpp(其中复制了log的函数体),这会使得链接器不知道连接哪个函数体)

在这里插入图片描述
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以保证可以被其他翻译单元调用)
文章来源:https://blog.csdn.net/Eeeeye_/article/details/135125308
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。