# c++ hello world

### c语言的编译步骤

```bash
gcc 编译  hello.c -o 生成的目标(可执行文件)名字为 world
```

#### `预处理`

```bash
gcc -E hello.c -o hello.i
```

`带#的语句就是预处理指令，预处理指令在预处理的时候处理了`

- 头文件展开： `#include <stdio.h>` 包含文件`stdio.h`（**预处理时将stdio.h 文件拷贝至预处理文件中**）

- 删除注释： 注释有两种方法： `//`  `/* */`

- 宏替换： `#define` 代表是声明一个宏，在预处理时会将宏给`替代` (预处理的时候就会替换)

- 预处理时  **不会检查语法错误**

- 条件编译： 条件不成立： `#if 0 -> #endif`   条件成立 `#if 1 -> #endif` 
  - c语言中 `0表示不成立` `1表示成立`
- 宏定义展开、头文件展开、条件编译等，同时将代码中的注释删除，这里并不会检查语法

#### `编译`

```bash
gcc -S hello.i -o hello.s
```

- 将**预处理文件**编译生成**汇编文件**     **检查语法错误**
- 检查语法，将预处理后文件编译生成汇编文件

#### `汇编`

```bash
gcc -c hello.s -o hello.o
```

- #### 汇编文件编译生成二进制文件.o

- 将汇编文件生成目标文件(二进制文件)

#### `链接`

```bash
gcc    hello.o -o hello
```

- 设置**运行环境**，**堆栈**等，**链接其他库**
- C语言写的程序是需要依赖各种库的，所以编译之后还需要把库链接到最终的可执行程序中去

![1](https://cdn.hashnode.com/res/hashnode/image/upload/v1653445614659/jaub2zI6B.png)

| **选项** | **含义**                    |
| -------- | --------------------------- |
| -E       | 只进行预处理                |
| -S(大写) | 只进行预处理和编译          |
| -c(小写) | 只进行预处理、编译和汇编    |
| -o file  | 指定生成的输出文件名为 file |

| **文件后缀** | **含义**              |
| ------------ | --------------------- |
| .c           | C 语言文件            |
| .i           | 预处理后的 C 语言文件 |
| .s           | 编译后的汇编文件      |
| .o           | 编译后的目标文件      |

####  一步编译

```
gcc hello.c -o demo（还是经过：预处理、编译、汇编、链接的过程）：
```
