1.C++是如何工作的 2.编译 3.链接 1.C++是如何工作的 a. 预处理 编译器收到源文件后, 一看到这条语句, 就先处理这些语句, 在实际编译发生前就处理这些语句 常见的预处理语句: #include, #define, #if def #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内联函数, 将函数调用替换为函数体