视频地址:
https://www.youtube.com/watch?v=18c3MTX0PK0&list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb&index=2
How C++ works
Preprocessor Statement:在编译之前,读取库文件的过程
Compile:当执行Preprocessor Statement之后,会进行编译过程。这个过程会将C++代码转化为机器代码。
在属性中可以决定编译出来的应用的配置
C/C++中的配置决定了文件是如何被编译的
头文件不会被编译,只有
cpp
文件会被编译,当他们被包含进cpp
文件中他们才会被编译。cpp
文件会被编译成目标文件,visual studio使用的扩展名是.obj
Linker:当
cpp
文件被编译成.obj
文件之后,会被链接器组合在一起为.exe
文件
Multiple File
- 声明:告诉编译器这个函数存在
- 定义:告诉这个编译器这个函数是什么,哪些是这个函数的主体
当定义了一个函数,在其他地方同样声明了一个函数,可以通过编译,但是链接器会寻找这个函数定义的地方,如果找不到会发生编译器错误
Link Error
当我们包含一个头文件时,我们只是将它复制到该位置。如果有多个文件包含包含同一个头文件时,这个头文件中的函数如果是不是声明而是定义,可能会触发链接错误:重定向。
解决方法:在头文件的相关函数中使用static
或者 inline
,或者头文件中仅声明
- static:可以让包含该头文件的
cpp
文件生成一个只在内部生效的版本,并且对其他人不可见。 - inline:可以将函数主体替换到包含该头文件的
cpp
文件中调用该函数的地方。 - 头文件中仅声明:在头文件中声明,在
cpp
文件中实现主体
Using Libraries in C++ (Static Linking)
库通常包含两个部分:include
和lib
- include:包含一堆头文件,可以直接使用其中的函数。
- lib:头文件中的函数在预构建的二进制文件中,这些二进制文件就在这个文件夹。
静态链接和动态链接的区别
- 静态链接:库实际上直接被编译进可执行的文件如:
.exe
文件中。 - 动态链接:动态链接是在运行时执行Link的,有一个加载的过程的库函数,可以在Windows API中找到。在运行时有一个独立的文件比如:
.dll
文件,和可执行文件放在一起,当运行时被加载。
静态链接库的操作
在
属性-> c++ ->常规->附加包含目录
中,将include文件夹的绝对路径放进去。或者可以使用宏:
$(SolutionDir)
将相对路径填进去。这个宏的路径是你的解决方案的路径。在
属性-> Linker ->输入->附加依赖项
中,添加.lib
文件的路径。如果你不添加路径,可以在
Linker ->常规
中修改附加库目录
,添加包含相关的lib
文件的路径进去,附加依赖项只需要添加文件的名称即可。
C++ Header Files
头文件是一个公共访问的区域,一般只存放函数的声明,而定义是在相关的cpp
文件中实现的。
每次创建头文件会出现以下代码,这是一条预处理指令,只包含该文件一次,防止多次包含同一个头文件。
1 |
头文件引用符号的区别:
- “”:从当前文件路径开始搜索头文件
- <>:从include路径文件夹中搜索头文件
How to DEBUG C++ in VISUAL STUDIO
两个重要的debug方法:断点和读取内存
断点调试
通过在程序块左侧添加红色的断点,来控制代码的停止和执行,以下是对于停止状态下的操作:
- step into:如果有函数,就进入这个函数
- step over:跳到下一行
- step out:跳出当前函数,到达被调用的地方
黄色箭头:表示停留在当前位置,还没有执行该位置的内容。
Local:当前的所有变量
Watch:可以选择搜索需要监视的变量
此外还有C++性能分析器:
教程:https://blog.csdn.net/u011942101/article/details/123656944
BEST Visual Studio Setup for C++ Projects
Visual Studio的原始设置有些奇怪,修改以下能够提高代码管理的效率。
优化目录结构:
1
2
3├─Dependencies
├─res
├─srcDependencies用来存储我们使用的外部库,res用来存储资源文件,src用来存储大部分cpp文件和头文件。
在属性->常规->常规属性修改属性:
输出目录:
1
$(SolutionDir)bin\$(Platform)\$(Configuration)\
中间目录:
1
$(SolutionDir)bin\intermediates\$(Platform)\$(Configuration)\
Static in C++
Static在C++中有两种含义,取决于在什么样的情况下
在类或者结构体外使用Static:
由于在全局变量中不允许声明两个一样的变量,当我们在一个cpp文件中定义了一个变量,我们需要在其他声明到这个变量的地方加上extern,否则会触发链接器错误。
而Static有点像在类中的私有变量,链接器不会在定义这个变量或者函数之外的翻译单元查找这个变量或者函数。因此可以在其他地方声明相同的变量,但是要加上Static
在类或者结构体内使用Static:
- 与所有的实例共享内存,创建实例时只会有该静态变量一个实例。当有一个实例改变了,那么他会更新到所有创建的实例中。
- 在使用静态变量时需要提前声明。
- 静态方法不能访问非静态变量
Class
Inheritance in C++:使用
:
就能继承类中的变量和函数虚函数:使用virtual在基类中,override在继承类中,能够正确重写继承类中的方法。
Interfaces in C++ (Pure Virtual Functions):使用virtual关键字,并且将方法赋值为0,这个类就会变成接口,无法被实例化,只能实例化实现了其中方法的类。
C++中没有专门的接口类,只能用纯虚函数的方法
Visibility in C++
在C++中有三种可见性修饰词:private、protected、public
c#中有internal,用于限制访问在当前程序集中。
- private:只有这个类以及friend才能访问,继承的也不行
- protected:这个类以及继承它的子类都能访问
- public:所有人都能访问它