/
...
/
/
Chapter.0 Before The Code
Search
Try Notion
Chapter.0 Before The Code
安装
Mac
Linux
Windwos
编译
编译过程
Open Pre Process to File : *.i文件为预处理后的结果
编译后为 .o文件
将 .o 文件打包可以打包成为静态库
.a(Linux) .lib(Win) 文件
区别于动态库 .so(Linux) .dll(Win)
ERROR Code
字母C开头: 编译错误
字母LNK开头: 链接错误
链接
Entry Point
exe 必须要有一个入口函数 Entry Point
不一定需要是main
声明的意义
未声明函数头: 编译错误
声明了函数头→相当于告诉编译器这个函数保留到链接时候去链接
链接的必要性
函数声明和函数定义不同, 找不到对应的函数 unresolved external symbol 但是可以编译(LNK阶段出错)
相对的: 当代码中不真的调用某个函数的时候, 哪怕声明了一个没有定义的函数, 也不会出错
”死函数”
“死”函数: 在当前代码情况下不可能被调用的函数(被Entry Point 直接或间接跳转)
死函数调用无定义函数: LNK错误
🖼️”死”函数调用不存在的函数Log
但是无法保证被作为库被其他东西调用, 找不到函数定义的函数声明会报错
静态的死函数调用
加入static 后死函数如果不在本文被调用, 就直接不编译了
不编译死函数也就不会导致死函数调用无定义的函数出现链接错误了
头文件
在.h中写函数定义导致多重定义
static前缀: 每个cpp都有一份函数的定义
inline前缀: 不仅每个cpp都有一份函数代码,而且实际上无函数跳转,即每个调用都有一份函数代码
在翻译单元中写函数定义(即一般模式)
💡在理论上, 一个翻译单元可能不只有一份文件, 我们可以在include "A.cpp" 使得一个翻译单元有两个文件
<...> and "..." :
<...>括号仅能使用IncludePath 中定义的有文件
“...” 可用于相对CPP地址的其他
#Program Once
和ifndef def作用相同 现代编译器都支持这条宏指令
Debug
Debug指令
设置断点后, 程序运行到将要执行断点的这一行
Step Into: 如果指向函数, 则进入函数
Step Over: 直接跳到下一行代码, 如果当前为函数, 跳过中间函数
Step Out: 跳出当前函数
Debug Mode
🖼️MSVC 为局部变量提前塞满 CC
编译器会做额外的工作使得调试更加轻松
比如在未初始话的变量所在空间里面提前塞满东西比如 MSVC 编译器
但会减慢程序运行速度
VS 配置
Filter( Keil 也有类似的结构)
🖼️Filter Example
新创建C++ Project时候会出现这些”文件夹” , 右键创建新Filter 不会在硬盘上创建新的文件夹
直接在Filter 里面创建新文件, 在硬盘上直接创建在项目的根母乳里面