1.C++是如何工作的
2.编译
3.链接
1.C++是如何工作的
a.预处理 编译器收到源文件后,一看到这条语句,就先处理这些语句,在实际编译发生前就处理这些语句 常见的预处理语句:#include,#define,#ifdef #pragma#include找到这个文件, 将这个文件的所有内容拷贝到现在的文件b.当预处理语句被处理后,文件被编译,编译器将所有c++代码转换为目标文件,使用vs生成的 文件后缀是obj;存在某些重要的设置决定我们怎么转化代码-解决方案配置:构建项目的规则-解决方案平台:32位操作系统还是64位操作系统 c.link是将obj文件合并成一个执行文件(exe),vs中ctrl+F7用于单独编译cpp文件;函 数声明表示函数存在,定义表示函数体;链接寻找函数的定义和程序的入口点
2.编译
核心作用:将预处理后的文件翻译成汇编语言代码,然后将汇编语言代码翻译成二进制码,生成 目标文件(windows.obj后缀),具体操作:a.语法分析 检查代码是否符合c++语法规则(比如少分号,括号不匹配都会在此报错)b.语法分析 检查代码逻辑合理性(比如变量未声明就使用,类型不匹配)c.优化 对代码进行编译优化(比如死代码消除,提升运行效率)d.生成汇编代码 将合法的c++代码转化为对应cpu架构的汇编指令 e.将汇编代码翻译成二进制码,生成目标文件
3.链接
a.核心作用:将多个目标文件(自己写的+系统/第三方库的目标文件)合并,解析符合引用,生成可执行文件;比如你的代码中调用了cout(属于c++标准库),链接器会找到标准库的目标文 件,把cout的实现和你的代码合并,解决"未定义引用"问题 b.链接分为两种类型-静态链接:把库的代码直接复制到可执行文件中(体积大,运行时不依赖库文件,后缀.a/.dll)-动态链接:只记录库的引用(体积小,运行时需要依赖动态库文件,后缀.so/.dll)
c.常见的链接错误-未解决的外部符合unresolved external symbol表示链接器找不到它需要的东西时发生-存在重复的符合,函数或变量有相同的名字和相同的签名
![]()
还可以通过inline内联函数,将函数调用替换为函数体