C++ 学习笔记(1)预编译、编译、链接
预编译(Preprocessing)
cppreference中:
GPT这么说:
C++预编译是指在编译阶段之前对代码进行的一系列预处理操作。预编译的目的是为了将代码中的预处理指令和宏展开,以及进行一些其他的预处理操作。
预处理指令包括以井号(#)开头的指令,如#include、#define、#ifdef等。这些指令在编译阶段之前会被预处理器解析和处理。预处理器会根据这些指令执行相应的操作,例如将其他文件的内容插入到当前文件中(#include指令)、定义宏(#define指令)等。
宏展开是指将代码中的宏名称替换为其对应的定义。宏是用#define指令定义的标识符,它可以代表一段代码片段或一个常量。预处理器会将代码中的宏名称替换为其对应的定义,以便在编译阶段进行处理。
除了宏展开,预编译还可以进行一些其他的操作,例如条件编译和错误处理。条件编译是指根据条件判断是否编译某段代码,可以使用#if、#ifdef、#ifndef等指令进行条件判断。错误处理是指在预编译阶段检测代码中的错误,并给出相应的错误提示。
预编译是C++编译过程中的一个重要阶段,它可以对代码进行一些必要的处理和准备工作,以便在编译阶段进行后续的操作。预编译通过对代码中的预处理指令和宏进行解析和处理,为编译器提供了更加清晰和规范的代码,提高了编译的效率和准确性。
包括#include "xxx.h"
在C++中,#include<xxx.h> 用过很多次,但也没去搞懂这句话在干啥,只知道这是在导入头文件,好像老师上课也是这么说的,今天才明白,#include
到底在干什么: 找到xxx.h文件,然后将文件中的内容复制到 #include<xxx.h>的位置处
例如:
在print.txt文件存放:
在main.cpp中定义函数func()
按下Ctrl+F7, 完成编译,通过:
查看预处理输出文件main.i:
include "print.txt"文件做的就是 将print.txt文件打开,然后将其中的内容完整的复制到 该位置。
替换#define语句
最基础的用法就是, #define A B, 这样,编译器在就会将A替换成B
#if
if是C++中的条件编译指令,用于根据条件判断是否编译某段代码。它的语法形式如下:
#if 条件表达式
// 需要编译的代码
#endif
条件表达式可以是一个常量表达式、宏定义、预定义宏或关系表达式。如果条件表达式的结果为真(非零),则编译器会编译#if和#endif之间的代码;如果条件表达式的结果为假(零),则编译器会忽略这段代码,不进行编译。
编译(Compilation)
在编译阶段,编译器会将预处理后的代码转换为汇编语言。编译器会对代码进行词法分析、语法分析和语义分析。词法分析将代码分解为基本的语法单元,例如标识符、关键字、运算符等。语法分析根据语法规则构建抽象语法树(Abstract Syntax Tree,AST),检查代码是否符合语法规范。语义分析对代码进行类型检查、符号解析等,确保代码的语义正确。
在 Visual Studio 2022中,编译项目后,项目的Debug目录下,会生成 .obj
文件,被称为目标文件,包含了编译器将源代码转换为汇编语言后的结果。
链接(linking)
编译结束后,链接器link就登场了,它最直观的作用就是将,每个cpp文件产生的obj文件连接整合成一个可执行文件,在windows下,就是.exe
文件。