返回本首页
返回目录页
返回知识库

所谓的编译型语言,指的是一次编译,直接运行,它是直接把源文件编译成计算机可以直接识别和执行的二进制指令集!
C++源程序至可执行程序过程:

5.1-源程序(C++)

使用C++编程语言,编写代码指令集(不能够直接被计算机识别和执行)!

5.2-预处理阶段

预处理阶段主要是去除注释,处理预处理指令!

  1. - **注释**

//单行注释
/多行注释/
注释风格建议

  - **预处理指令**
     - **宏定义**

所谓的宏定义预处理指令其实就是定义一个标识符用来代表一个具体数据的过程,将来在所有引用这个具体数据的地方,我们统统用这个标识符代替,一旦我们的这个具体的数据在程序多处引用,我们只需要在这个标识符声明的地方将具体数据修改一下即可,不需要多处修改,减少工作量,将来在预处理阶段,我们的预处理程序会根据宏定义来替换所有的标识符为具体的数据(纯粹的文本替换,宏定义时不要吝啬括号)!
无参宏:#define 宏名 宏体 //#define PI 3.14
有参宏:#define 宏名(参数列表) 宏体 //#define SUM(X,Y) (X)+(Y)
特殊宏:双引号,单引号,连接
#define A(x) #x //A(1) -> “1”
#define A(x) #@x //A(1) -> ‘1’
#define A(x,y) x##y //A(“12”,”34”) -> “1234”, A(12,34) -> 1234

     - **包含头文件**

任何东西在使用的时候,必须要先有这个东西,即存在声明,而声明存在于一个.h文件,那么我们就必须要在使用前,先包含这个头文件,如果存在于同一个文件内,就不需要包含,我们通过头文件包含预处理指令就可以让预处理程序帮我们将需要包含的头文件包含进来,我们只需要告诉预处理程序,包含哪个头文件即可
包含系统头文件:#include
包含自己头文件:#include “xxxx.h”
防止头文件多次包含:
1-#pragma once
2-通过宏来避免
#ifndef xxxx
#define xxxx

#endif

     - **条件编译**

if 条件
#endif
//
#if 条件
#else
#endif
//
#if 条件
#elif 条件
#else
#endif
#pragma指令:设定编译器状态或者指示编译器完成一些指定动作!
防止头文件包含#pragma once
引用动态库#pragma comment(lib,”xxxxx”)
用于警告信息#pragma warning(xxxxx)
编译输出窗口输出消息#pragma message(“消息文本”)

5.3-编译阶段

编译阶段其实就是将预处理处理好的程序交付给我们的编译程序进行编译,最终呢通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码或汇编代码!

5.4-汇编阶段

将编译好的中间代码或者汇编代码交付给我们的汇编程序,最终呢会生成对应汇编代码的二进制指令!

5.5-链接阶段

将程序相关的文件链接起来,生成一个完整的可执行程序!

5.6-可执行程序(二进制)

可执行程序也是按照一定格式组织起来的,这种格式windows下被称之为PE格式,Linux被称之为:ELF格式

Linux:gcc编译

image.png
预处理:
image.png
gcc -E main.c -o main.i
image.png
编译:
gcc -S main.i -o main.s
image.png
汇编:
gcc -c main.s -o main.o
链接:
gcc main.s -o main