0.为什么学C++
本人的专业属于电子信息类,所学的科目非常杂,毕业以后可以从事的行业也很杂。除了纯电路设计类的工作,剩下的一些工作有一些程序的编写任务。对于算法的研究有matlab编程语言就够了。但对于嵌入式开发和一些算法落地的工作基本都采用c++/c开发。复杂嵌入式系统开发基本采用c++编程,这也是我深入学习c++的初衷。
1.c++的基本认识
1.1概述
c++是c语言的拓展,其关注性能
● 与底层硬件紧密结合
● 对象生命周期的精确控制
● Zero-overhead Abstraction
引入大量特性,便于工程实践
● 三种编程范式:面向过程、面向对象(这一点是与c语言最大的不同)、泛型
● 函数重载、异常处理、引用
c++先有的标椎: C++98/03 , C++11 , C++14 , C++17 , C++20,大概每三年发布一次新的标准,在开发过程中,当前用的最多的是c++11。
1.2 c++的开发环境
编译器:Visual C++ / GCC (G++) / Clang (Clang++)
集成开发环境(就是我们常说的IDE): Visual Studio / CodeLite / Code::blocks / Eclipse/clion
注:
- vscode只是编辑器,如果要编译程序需要安装插件。
- clion的界面和pycharm差不多。
2.c++的编译/链接模型
作为计算机只能识别0101代码,所谓的高级语言必须要翻译成0101代码才能让计算机执行。这个过程被称为编译。那么为什么需要链接呢?通常我们写的程序不止一个程序文件,如果我们修改一次需要编译所有的文件将会太耗时,为此我们通常使用以下的方式:
这样做编译耗资源较少,处理速度较快,便于程序修改升级。如果改了源文件1,只会重新编译源文件1,会生成新的目标文件1,然后重新链接一下。
一般编译器生成可执行文件的过程:
预处理:
- 将源文件转换为翻译单元的过程。
- 防止头文件被循环展开 。 #ifdef 解决方案,#pragma once 解决方案
编译:
- 将翻译单元转换为相应的汇编语言表示
- 编译优化: https://godbolt.org/z/zh9aqx
链接:
- 合并多个目标文件,关联声明与定义
- 连接( Linkage )种类:内部连接、外部连接、无连接
- 链接常见错误:找不到定义