2024-10-17 08:56:34 +00:00
# 第一章:开发环境的安装和配置(⭐)
## 1.1 什么是编译器?
* 要开发 C/C++ 程序,需要安装 C/C++ 编译器,目前有两种主流实现,即:
* GCC( GNU Compiler Collection) : 全平台实现, 即支持 Windows、MacOS、Linux 等。
* MSVC( Microsoft Visual C++):只支持 Windows 系统。
* GCC 在 Windows 上的版本有很多,如:[MinGW-w64 ](https://www.mingw-w64.org/ )、[Gygwin ](https://cygwin.com/ )、[MSYS2 ](https://www.msys2.org/ )。它们之间的区别,如下所示:
| 特性 | MinGW-w64 | Cygwin | MSYS2 |
| ------------ | ----------------------------- | ------------------------------------- | ----------------------------------------------------- |
| **简介** | Minimalist GNU for Windows | POSIX 兼容环境和工具集 | 结合了 MinGW 和 Cygwin 的工具集 |
| **编译器** | 提供 GCC 编译器 | 提供 POSIX 兼容环境,包含大量工具 | 提供 MinGW-w64 工具链和 Cygwin 环境 |
| **生成文件** | Windows 原生可执行文件 | POSIX 兼容的可执行文件 | 可以生成 Windows 原生可执行文件或 POSIX 文件 |
| **依赖** | 无需额外依赖 | 依赖 Cygwin DLL | 根据使用工具链决定( MinGW-w64 无依赖, Cygwin 有依赖) |
| **工具和库** | 基本的编译工具 | 丰富的 Unix 工具和库 | 丰富的工具和库,强大的包管理系统 |
| **性能** | 性能较好 | 可能较低,因为通过兼容层调用系统 | 取决于使用的工具链( MinGW-w64 性能较好) |
| **复杂度** | 简单易用 | 设置和使用相对复杂 | 较为灵活,复杂度介于 MinGW-w64 和 Cygwin 之间 |
| **适用场景** | 开发 Windows 原生应用 | 运行和开发 Unix 程序 | 混合使用 Unix 工具和开发 Windows 原生应用 |
| **优点** | 轻量级,直接生成 Windows 应用 | 完整的 POSIX 兼容环境,丰富的工具 | 灵活的环境,强大的包管理系统 |
| **缺点** | 工具和库较少 | 生成文件依赖 Cygwin DLL, 性能可能较低 | 环境较大,占用更多空间,复杂性比 MinGW-w64 高 |
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> * ① MinGW-w64 、Cygwin 以及 MSYS2 任选其一安装即可。
> * ② 目前的 Win10 和 Win11 版本支持 WSL2 ( Windows Sub Linux 2 ,即 Windows 的子系统 Linux) , 可以实现在 Windows 系统上安装一个 Linux ,然后再运行 Linux 中的 GCC 工具链。
> * ③ 本人的操作系统是 Win11 ,安装和配置都将以该系统为基础作为演示,后续不再赘述!!!
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 1.2 编译器的安装和配置
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 1.2.2 MinGW-w64 的安装和配置
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
#### 1.2.2.1 安装
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 下载到本地:略。
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
> [!NOTE]
>
2024-10-17 08:56:34 +00:00
> 下载地址在[这里](https://github.com/niXman/mingw-builds-binaries/releases/download/13.2.0-rt_v11-rev1/x86_64-13.2.0-release-posix-seh-ucrt-rt_v11-rev1.7z)。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 解压到指定的目录,即:
> [!NOTE]
>
> 本人的解压目录是:`D:\develop\mingw64` 。
2024-10-08 11:44:30 +08:00
2024-10-17 09:44:28 +08:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
#### 1.2.2.2 配置 path 环境变量
* 配置环境变量,以便任意目录都可以执行 gcc 命令,即:
2024-10-08 11:44:30 +08:00
2024-10-17 09:44:28 +08:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00


> [!NOTE]
2024-10-17 01:20:50 +00:00
>
2024-10-17 08:56:34 +00:00
> 因为,本人安装 MinGW-w64 的目录是 `D:\develop\mingw64`,所以本人需要配置的 path 环境变量就是`D:\develop\mingw64\bin`。

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

* 测试是否安装成功:
```shell
gcc --version
2024-10-08 11:44:30 +08:00
```
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 1.2.3 Cygwin 的安装和配置
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
#### 1.2.3.1 安装
* 下载到本地:略。
> [!NOTE]
2024-10-17 01:20:50 +00:00
>
2024-10-17 08:56:34 +00:00
> 下载地址在[这里](https://www.cygwin.com/install.html)。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 点击安装:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00






* 选择需要安装的软件包:
> [!NOTE]
2024-10-08 11:44:30 +08:00
>
2024-10-17 08:56:34 +00:00
> 默认是最小化安装,没有 GCC, 需要选择 gcc-core、gcc-g++、make、gdb、binutils 。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 安装 gcc-core :
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 安装 gcc-g++ :
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 安装 make :
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 安装 gdb :
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

* 安装 binutils :




#### 1.2.3.2 配置 path 环境变量
* 和 `1.2.2.2 配置 path 环境变量` 步骤相同:略。
### 1.2.4 MSYS2( 推荐)
#### 1.2.4.1 安装
* 下载到本地:略。
> [!NOTE]
2024-10-17 01:20:50 +00:00
>
2024-10-17 08:56:34 +00:00
> 下载地址在[这里](https://www.msys2.org/)。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 点击安装:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 可能很多人,会遇到安装到 `50%` 就一直卡死在那边,不用慌,关闭它,再次重新安装即可。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 点击运行 MSYS2 :

* 出现命令终端:
> [!NOTE]
>
> 如果没有出现命令终端,也不要慌,去 Win11 操作系统的`开始`菜单,那边找一下,就能找到。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

* 替换清华镜像源(可选):
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
```shell
2024-10-17 08:56:34 +00:00
sed -i \
"s#https \?://mirror.msys2.org/#https://mirrors .tuna.tsinghua.edu.cn/msys2/#g " \
/etc/pacman.d/mirrorlist*
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 安装 gcc 等相关开发包:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```shell
pacman -Syu --noconfirm # 更新包管理器
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```shell
pacman -Sy base-devel --noconfirm # 安装开发工具包
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 也许,你会看到其他人的安装命令是 `pacman -Sy mingw-w64-x86_64-toolchain --noconfirm`,此处解释下两者的区别:
>
> * ① `mingw-w64-x86_64-toolchain` 使用更传统的 MSVCRT, 适合需要经典 MinGW 环境的项目或依赖较老 C 运行时的应用。
> * ② `mingw-w64-ucrt-x86_64-toolchain` 使用 Microsoft 的 UCRT, 更适合现代 Windows 开发,提供更好的兼容性和性能。
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
```shell
2024-10-17 08:56:34 +00:00
pacman -Sy mingw-w64-ucrt-x86_64-toolchain --noconfirm # 安装开发 gcc 相关工具链
2024-10-08 11:44:30 +08:00
```
2024-10-17 08:56:34 +00:00

#### 1.2.4.2 配置 path 环境变量
* 和 `1.2.2.2 配置 path 环境变量` 步骤相同:略。
> [!NOTE]
>
> 本人需要配置的 path 环境变量是 `C:\msys64\ucrt64\bin` 。
## 1.3 什么是 IDE( 集成开发环境) ?
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 在实际开发中,除了`编译器` 是必须安装的工具之外,我们往往还需要很多其他的辅助软件,如下所示:
* 编辑器:用来编写代码,并且给代码着色,以方便阅读。
* 代码提示器:输入部分代码,即可提示全部代码,加速代码的编写过程。
* 调试器:观察程序的每一个运行步骤,发现程序的逻辑错误。
* 项目管理工具:对程序涉及到的所有资源进行管理,包括:源文件、图片、视频、第三方库等。
* 漂亮的界面:各种按钮、面板、菜单、窗口等控件整齐排布,操作更方便。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 这些工具通常被打包在一起, 统一安装和发布, 如: Visual Studio、CLion 以及 VS Code , 通常统称为集成开发环境( IDE, Integrated Development Environment) 。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> * ① IDE( 集成开发环境) 就是一系列开发工具的组合套装。这就好比台式机, 核心部件是主机。主机就相当于 IDE 的代码编辑器和编译器, 有了它们, 开发者就可以进行基本的编程工作。然而, 正如我们在购买台式机时, 通常还会附带显示器、键盘、鼠标、U盘、摄像头等外围设备, IDE 也同样提供了一系列额外的工具和插件,比如:调试器、版本控制集成、代码补全、代码重构工具等。这些“外围设备”让开发过程更加高效、直观,并且能够满足更多的开发需求,使得 IDE 成为一个完整的开发环境。
> * ② 严格来讲, VS Code 属于编辑器,而不是 IDE; 但是, 可以通过安装各种插件, 来完成 IDE 的功能;而 Visual Studio 和 CLion 属于 IDE。
> * ③ 在实际开发中,使用 IDE 进行编程并不是一种非常丢人的事情。而使用编辑器,如:`记事本`、`vi/vim` 等,进行编程,也并不是一件非常骄傲的事情。可能有些人会在网上发布这样的言论:“学习编程,刚开始需要使用`记事本`或 `vi/vim`等简单的编辑器软件,不要使用 IDE ”,目的可能是为了让初学者熟悉编程的基础概念和语法,并避免依赖 IDE 的辅助功能。但是,这种方法或许可以起到锻炼基础技能的功能,但这并不意味着 IDE 就不适合初学者。事实上,许多 IDE 还提供了初学者友好的界面和工具,可以帮助新手更快地入门和理解编程。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 1.4 IDE 的安装和配置
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 1.4.1 CLion
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
#### 1.4.1.1 概述
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* [CLion ](https://www.jetbrains.com/clion/ ) 是一款由 JetBrains 推出的跨平台 C/C++ 集成开发环境( IDE) , 它具有智能编辑器、CMake 构建支持、调试器、单元测试、代码分析等功能,可以极大提高 C/C++ 开发效率。
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
> [!NOTE]
>
2024-10-17 08:56:34 +00:00
> * ① 本次,演示的 CLion 的安装版本是 `2024.2.1` ,后续版本可能会更新,但是操作几乎不会发生太多变化!!!
> * ② CLion 作为一个 IDE, 本身就携带了各个平台( 操作系统) 的 C 语言编译器, 如: Windows 中就是 MinGW; 但是, CLion 中自带的 C 语言编译器版本可能并非我们实际开发所想要的(版本不是很高),这也是在 Windows 中,为什么推荐使用 `MSYS2` 的原因所在。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
#### 1.4.1.2 安装
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 鼠标双击,进入安装:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 下一步:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 下一步:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 下一步:
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00

2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
* 安装:
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00

2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
* 安装完成:
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 通常安装完成之后,桌面上会出现 CLion 的快捷方式,可以点击此快捷方式,以便快速启动 CLion 。
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00

2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
#### 1.4.1.3 配置
2024-10-17 09:44:28 +08:00
2024-10-17 08:56:34 +00:00
* 打开 CLion :
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 切换中文界面(可选):
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 对于以中文、韩语和日语为母语的开发者,`CLion` 在 `2024.2` 版本之后就绑定了本地化插件,即不需要再安装本地化插件了。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 配置 UI:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 配置自定义字体(可选):
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 配置 `系统设置` 相关功能:

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 配置`文件编码` 为 UTF-8:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 配置`控制台编码` 为 UTF-8:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 配置`显示方法分隔符` 功能:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 配置`编辑器` 的字体(可选):
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
> [!NOTE]
>
2024-10-17 08:56:34 +00:00
> 本人是安装了 `Fira Code` 字体,如果你也需要安装此字体,可以去 [GitHub](https://github.com/) 搜索并下载。

* 检测 GCC 工具链是否安装成功:

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 1.4.2 VS Code
#### 1.4.2.1 概述
* [Visual Studio Code (VS Code) ](https://code.visualstudio.com/ ) 是一个免费的开源代码编辑器,适用于 Windows、MacOS 和 Linux 平台。它支持语法高亮、智能代码补全( IntelliSense) 、内置调试工具和Git集成。用户可以通过扩展来添加更多功能, 如: 支持新的编程语言、主题和调试工具。VS Code 还支持在微软 Azure 上进行部署和托管,适用于各种编程语言和框架。
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
> [!NOTE]
>
2024-10-17 08:56:34 +00:00
> * ① Visual Studio Code 需要安装对应的插件,才能运行 C/C++ 代码。
> * ② Visual Studio Code 除了开源免费的优点之外,还有一个优点就是插件巨多(几乎所有主流的编程语言都提供有对应的插件),这也是很多程序员喜欢使用它的原因。
#### 1.4.2.2 安装
* 鼠标双击,进入安装:

* 同意协议:

* 下一步:

* 下一步:

* 下一步:

* 安装:

* 安装过程:

* 安装完成:

#### 1.4.2.3 配置
* 安装`中文` 插件:


* 安装 `C/C++` 插件:


### 1.4.3 Microsoft Visual Studio
#### 1.4.3.1 概述
* [Visual Studio ](https://visualstudio.microsoft.com/ )(简称 VS) 是由微软公司发布的集成开发环境。它包括了整个软件生命周期中所需要的大部分工具, 如: UML 工具、代码管控工具、项目版本控制 Git 等。
* Visual Studio 支持 C/C++、C#、F#、VB 等多种程序语言的开发和测试,可以用于生成 Web 应用程序,也可以生成桌面应用程序,功能十分强大,但下载和安装很可能耗时数小时,还可能会塞满磁盘。
* Visual Studio 有三种版本:社区版(免费,不支持企业使用),专业版(收费)和企业版(收费)。企业版拥有面向架构师的功能、高级调试和测试,这些功能是另外两种版本所没有的。
* Visual Studio 旨在成为世界上最好的 IDE( 集成开发环境) , 号称“宇宙第一强大 IDE”。
> [!NOTE]
2024-10-17 01:20:50 +00:00
>
2024-10-17 08:56:34 +00:00
> 本人安装的 Visual Studio 的安装版本是 Visual Studio 2022 ,后续版本可能会更新,但是操作几乎不会发生太多变化!!!
#### 1.4.3.2 安装
* 鼠标双击,进入安装:

* 继续:

* 等待:

* 工作负荷(使用 C++ 的桌面开发):

* 单个组件:

* 语言包:

* 安装位置(修改默认的安装位置):

* 如果不是第一次安装,可能会出现`共享组件、工具和 SDK` 不可以修改,即:

* 此时,就需要打开`注册表编辑器` ,将如下图中的除了第一个选项,全部删除,然后关闭再重新安装,即:

* 开始安装:

* 安装中:

* 安装完成,然后关闭:

#### 1.4.3.3 配置
* 在开始菜单处,启动 VS :

* 登录或跳过该选项(有微软账号就注册,没有就暂时跳过):

* 继续:

* 注册 VS :

* 填写注册码:
> [!NOTE]
2024-10-17 01:20:50 +00:00
>
2024-10-17 08:56:34 +00:00
> * ① Pro 版本:`TD244-P4NB7-YQ6XK-Y8MMM-YWV2J`
> * ② Enterprise 版本:`VHF9H-NXBBB-638P6-6JHCY-88JWH`
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

## 1.5 什么是工程/项目 ?
### 1.5.1 概述
* 一个真正的软件往往包含多项功能,每一项功能都需要几十行、几千行甚至几万行的代码,如果我们将这些代码都放到一个源文件中,不但打开的速度极慢,代码的编写和维护也会变得非常困难。
* 在实际开发中,随着软件规模的增加,代码的复杂性也会显著提升,为了提高代码的易读性、维护性等,程序员会将代码按照功能分别放到不同的源文件中。
> [!NOTE]
2024-10-17 01:20:50 +00:00
>
2024-10-17 08:56:34 +00:00
> 需要说明的是,一个真正的软件除了源代码之外,往往还会包括图片、视频、音频、库(框架)等其它资源,这些也是一个个的文件。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 为了有效的管理这些种类繁杂、数目众多的文件,我们会将这些文件按照功能放到不同的目录中进行统一管理,并且这个目录下只存放与当前程序有关的资源。其实,这就是工程或项目。
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
> [!NOTE]
>
2024-10-17 08:56:34 +00:00
> 总结:
>
> * ① 随着软件规模的增加,代码的复杂性也会显著提升。将代码分割成多个模块或文件并分别管理,可以减少每个文件的复杂度,使代码更易读、易理解、易维护。工程提供了一个结构化的环境,将这些文件组织在一个系统化的目录结构中。
> * ② 除了代码,软件开发还涉及到各种资源的管理,如:图片、音频、视频、配置文件等。工程能够帮助开发者将这些资源合理地分类存放,并与代码一同管理,确保它们在开发、编译和运行时能被正确引用。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 许多 IDE 都提供了工程或项目的概念,其目的就是为了帮助开发者合理的管理软件开发中所需要的资源,如:图片、视频、音频、库(框架)等。
2024-10-09 01:09:29 +00:00
2024-10-17 08:56:34 +00:00

2024-10-09 01:09:29 +00:00
2024-10-17 08:56:34 +00:00
### 1.5.2 工程类型/项目类型
2024-10-09 01:09:29 +00:00
2024-10-17 08:56:34 +00:00
* 程序或软件是一个非常宽泛的概念,它可以细分为很多种类,如下所示:
* 控制台程序( Console Application) : 控制台程序是一种不具备图形用户界面的程序, 它通过文本方式与用户交互, 通常运行在命令行窗口( 黑底白字的终端) , 如: Unix/Linux 中的`ls` 命令、Windows 中的`cmd.exe` 等。
* GUI 程序( Graphical User Interface Program) : GUI 程序是一种具有图形用户界面的程序, 通过窗口、按钮、菜单等图形控件与用户交互, 如: 微信、QQ 等。
* 静态库和动态库:不单独出现,而是作为其它程序的一个组成部分,普通用户很难接触到它们。
* 静态库指的是在编译时包含到程序中的库,程序不依赖外部文件运行,如:在 C/C++ 中,静态库通常以`.lib` ( Windows) 或`.a` ( Unix/Linux) 为扩展名。
* 动态库指的是在运行时加载的库,允许多个程序共享,并且程序在运行时依赖这些库,如: 在Windows中, 动态库通常以`.dll` 为扩展名;在 Unix/Linux 中,以`.so` 为扩展名。
2024-10-09 01:09:29 +00:00
2024-10-17 08:56:34 +00:00
* 不同类型的程序( 控制台程序、GUI 程序、静态库、动态库等)需要不同的配置和文件结构,因此在 IDE 中创建项目时,选择正确的工程类型非常重要。不同的工程类型决定了 IDE 为我们生成的初始文件、目录结构,以及预设的一些编译和链接参数。
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
> [!IMPORTANT]
>
> * ① 控制台程序适合初学者,因为它更简单,没有复杂的界面元素,开发时可以专注于逻辑和代码本身。
> * ② 而 GUI 程序则涉及到用户界面设计和事件驱动编程,更适合有一定编程基础的人进行学习和开发。
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
# 第二章: C 语言入门( HelloWorld, ⭐)
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
## 2.1 手动版
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
* ① 新建一个 `HelloWorld.c` 的文件:
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00

2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
* ② 通过`记事本` 等软件打开该文件,输入如下的代码,并保存:
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
```c
#include <stdio.h>
int main(){
printf("Hello World");
return 0;
}
2024-10-17 01:20:50 +00:00
```
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00

* ③ 通过 `gcc` 命令编译该文件:
2024-10-09 09:34:19 +08:00
2024-10-17 01:20:50 +00:00
```shell
2024-10-17 08:56:34 +00:00
gcc HelloWorld.c -o HelloWorld.exe
2024-10-09 09:34:19 +08:00
```
2024-10-17 08:56:34 +00:00

2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
* ④ 执行:
2024-10-17 01:20:50 +00:00
```shell
2024-10-17 08:56:34 +00:00
./HelloWorld.exe
2024-10-09 09:34:19 +08:00
```
2024-10-17 08:56:34 +00:00

2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
## 2.2 VS Code 版
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
* ① 新建一个`空` 文件夹(目录),用于存放代码:
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00

2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
* ② 通过 `vscode` 打开该目录:
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00

2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
* ③ 在 `vscode` 中新建 `HelloWorld.c` 文件:
2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00

2024-10-09 09:34:19 +08:00
2024-10-17 08:56:34 +00:00
* ④ 设置 VSCode 中 C/C++ 的代码格式为行尾风格(可选):
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00


* ⑤ 编写如下的代码,并保存:
```c
#include <stdio.h>
int main(){
printf("Hello World");
return 0;
}
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ⑥ 通过 `gcc` 命令编译该文件:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```shell
gcc HelloWorld.c -o HelloWorld.exe
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

* ⑦ 执行:
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
```shell
2024-10-17 08:56:34 +00:00
./HelloWorld.exe
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ⑧ 安装 Code Runner 插件(步骤略),实现右键直接编译执行(可选):
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 2.3 VS 版
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ① 新建空项目:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ② 打开`解决方案资源管理器` :
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ③ 新建 `HelloWorld.c` 文件:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ④ 编写如下代码,并保存:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
#include <stdio.h>
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
int main(){
printf("Hello World");
return 0;
}
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ⑤ 编译和执行:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 2.4 CLion 版
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
* ① 新建空项目:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00


2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ② 编写如下代码,并保存:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
#include <stdio.h>
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
int main(){
printf("Hello World");
2024-10-08 11:44:30 +08:00
return 0;
}
```
2024-10-17 08:56:34 +00:00

* ③ 编译和运行:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ④ 默认情况下,一个项目只能有一个 c 源文件包含 main 函数,但是 CLion 可以有多个,如下:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00

* ⑤ 如果之后,有中文乱码问题,那么请做如下步骤:


2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
> [!NOTE]
>
2024-10-17 08:56:34 +00:00
> 内容如下所示:
>
> ```txt
> -Dfile.encoding=UTF-8
> -Dconsole.encoding=UTF-8
> ```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
# 第三章:五花八门的 C 语言编译器(⭐)
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 3.1 概述
* 由于 C 语言的历史比较久,而且早期没有规范,整个计算机产业也都处于拓荒的年代,所以就涌现了很多款 C 语言编译器,它们各有特点,适用于不同的平台。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 3.2 桌面操作系统
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 目前而言,主流的桌面操作系统就是 Windows、Linux 和 MacOS 。
* 对于 Windows 而言,使用的最多的 C/C++ 编译器是 `MSVC` ( Microsoft Visual C++),被集成在 Visual Studio 开发环境中,其特点如下:
* ① 兼容性: 与 Windows 操作系统和 Windows API 深度集成,生成的二进制文件为 PE 格式。
* ② 调试工具: 提供强大的调试工具, 如: Visual Studio Debugger。
* ③ 优化: 支持各种编译器优化,特别是针对 Windows 平台的优化。
* ④ 库支持: 提供丰富的 Windows 专用库,如:~~MFC( Microsoft Foundation Class Library) ~~。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> MSVC 不开源,我们可以使用 Visual Studio Community 社区版,但是如果想使用 Visual Studio Community 社区版生成出来的应用进行商用,就需要好好阅读微软的许可证和说明书了。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 对于 Linux 而言,使用的最多的 C/C++ 编译器是 `GCC` (支持多种架构和语言),并且很多 Linux 发行版本都将 GCC 作为默认的编译器,其特点如下所示:
* ① 广泛支持: 支持各种 Linux 发行版,是大多数开源项目的默认编译器。
* ② 强大的优化: 提供各种编译优化选项,适合多种性能需求的开发。
* ③ 丰富的工具链: 和 GDB( GNU 调试器) 、Make、Autoconf 等工具无缝集成。
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
> [!NOTE]
2024-10-08 11:44:30 +08:00
>
2024-10-17 08:56:34 +00:00
> 目前而言, GCC 已经属于跨平台的项目了,支持 Windows、Linux 和 MacOS ,在 Windows 上 GCC 的移植项目, 如: MinGW、Cygwin 以及 MSYS2, 其差别如下所示:
>
> * ① MinGW 提供了 GCC 编译器的 Windows 版本,可以生成 Windows 兼容的本地代码。
> * ② Cygwin 是一个在 Windows 上运行的类 Unix 环境,它提供了一套完整的 POSIX 兼容工具,包括 GCC 编译器。
> * ③ MSYS2 是一个在 Windows 上运行的轻量级、开源的 Unix-like 环境,它为 Windows 用户提供了类似于 Linux 的开发环境。MSYS2 是 MinGW 和 Cygwin 的后继者,旨在提供更现代化和更强大的开发工具集。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 对于 MacOS 而言,使用的最多的 C/C++ 编译器是 `Clang/LLVM` ,其特点如下:
* ① Xcode 集成: 深度集成到 Xcode 中,支持 Apple 的所有平台( macOS、iOS、tvOS、watchOS) 的开发。
* ② 优化和兼容: 生成的代码针对 Apple 的硬件进行优化,并兼容 GCC 的大部分功能。
* ③ 现代化: Clang 提供了对 C 语言标准的全面支持,并且以其快速的编译速度和易读的错误报告而著称。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 在 MacOS 中,尽管 Clang 是默认编译器;但是,也可以 Homebrew 等包管理器来安装 GCC ,以便开发 C/C++ 项目。
## 3.3 嵌入式系统
* 在嵌入式系统开发中,可用的 C 语言编译器以及工具链非常丰富, 有很多是免费或开源的,如下所示:
* `GCC (GNU Compiler Collection)` :
* 简介: GCC 是最广泛使用的开源编译器集合之一,支持多种处理器架构,包括 ARM、AVR、MIPS、RISC-V 等。
* 开源或免费:完全开源且免费,受到广泛的社区支持。
* `Clang/LLVM` :
* 简介: Clang 是基于 LLVM 架构的开源编译器,支持多种架构,并且与 GCC 兼容。
* 开源或免费:开源且免费,具有快速的编译速度和现代化的代码分析工具。
* `SDCC (Small Device C Compiler)` :
* 简介: SDCC 是一个开源的跨平台 C 编译器,主要用于 8 位和 16 位微控制器, 如: 8051、Z80、PIC 等。
* 开源或免费:完全开源且免费,适合教育和小型项目开发。
* `MPLAB XC Compilers` :
* 简介: MPLAB XC 是由 Microchip 提供的编译器系列,专门用于其 PIC 和 dsPIC 微控制器。
* 开源或免费:提供免费版本(使用标准优化级别),但也有付费版本提供更高级的优化。
* `ARM GCC` :
* 简介: ARM GCC 是 GCC 的一个专门版本,针对 ARM Cortex-M 系列微控制器进行了优化。
* 开源或免费:完全开源且免费,广泛用于工业、教育和开源项目中。
* `PlatformIO` :
* 简介: PlatformIO 是一个开源的嵌入式开发生态系统,支持多种开发板、框架和编译器。
* 开源或免费:基本功能免费,部分高级功能和插件需要订阅服务。
* `Eclipse` :
* 简介: Eclipse 是一个开源的集成开发环境( IDE) , 可以通过插件支持嵌入式开发。
* 开源或免费: Eclipse 和 GCC 都是开源免费的,适合跨平台开发。
* `Arduino IDE` :
* 简介: Arduino IDE 是一个简单易用的开源开发环境,广泛用于 Arduino 开发板和其他兼容开发板。
* 开源或免费:完全开源且免费,非常适合教育和入门级开发。
* ...
* 这些编译器以及工具链各有优势,开发者应根据目标硬件平台、项目需求和开发环境选择最适合的编译器。
## 3.4 C 语言为什么有那么多的编译器?
* C 语言并没有一个官方机构,也不属于哪个公司,它只有一个制定标准的委员会,任何其他组织或者个人都可以开发 C 语言的编译器,而这个编译器要遵守哪个 C 语言标准,是 100% 遵守还是部分遵守,并没有强制性的措施,也没有任何约束。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> * ① 各个厂商可以根据自己的利益和喜好来开发编译器。
> * ② 市场和用户的选择通常是推动编译器开发者遵循标准的主要动力。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 并且,不同硬件平台之间也存在差异,这会导致内存管理方式、寄存器、指令集等都有所不同,为了确保 C 语言程序能在这些硬件平台运行,就得针对该平台开发/定制不同的编译器。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> * ① 上述的情况,在单片机和嵌入式领域更加常见。
> * ② 总体而言, C 语言具有开放性,并且要适应不同的硬件平台,这使得不同厂商可以根据自己的需求来进行个性化开发/定制。
* 这也导致了一个非常棘手的问题,有的编译器遵守较新的 C 语言标准,有的编译器只能遵守较老的 C 语言标准,有的编译器还进行了很多扩展,比如:
* GCC、LLVM/Clang 更新非常及时,能够支持最新的 C 语言标准。
* MSVC 更新比较缓慢, 迟迟不能支持新标准, 例如: VC6.0、VS2010 都在使用 C89 标准, VS2015 部分支持 C99 标准。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 微软官方给出的答复:最新的标准已经在 C++ 中支持了, C 语言就没必要再重复了。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 初学者经常会遇到这种情况,有些代码在 MSVC 下能够正常运行,拿到 GCC 下就不行了,一堆报错信息; 或者反过来,在 GCC 上能运行的代码在 MSVC 下不能运行。这是因为不同的编译器支持的标准不同,每个编译器都进行了自己的扩展,假如你使用了 MSVC 自己的扩展函数,那么拿到 GCC 下肯定是不支持的。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!IMPORTANT]
2024-10-17 01:20:50 +00:00
>
2024-10-17 08:56:34 +00:00
> * ① 在学习的时候,无所谓使用那个 C 语言编译器了。
> * ② 但是,如果要开发实际项目(开源或商业),最好使用 `GCC` 编译器,因为其功能最强大、开源、跨平台、免费,支持最新的 C 语言标准。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
# 第四章:注释(⭐)
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 4.1 概述
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 编程语言中,`注释` 是一种`特殊` 的文本,它不会被编译器执行,而仅用于代码的解释和文档说明。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
>[!NOTE]
>
>* ① 注释是一个程序员必须有具有的良好编程习惯。
>* ② 在实际开发中,程序员可以将自己的思路通过`注释` 整理出来,然后再用`代码` 去实现。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 4.2 单行注释
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* C 语言中的单行注释的格式,如下所示:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
// 单行注释
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 在 CLion 中的快捷键是 `Ctrl + /` 。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 示例:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
#include <stdio.h> // 这是编译预处理指令
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
int main() { // 定义主函数
printf("你好,世界!!!"); // 输出所指定的一行信息
return 0; // 函数执行完毕时返回函数值0
}
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 4.3 多行注释
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* C 语言中的多行注释的格式,如下所示:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
/*
这是第一行注释
这是第二行注释
这是第三行注释
*/
```
>[!NOTE]
>
>* ① 多行注释不能嵌套使用!!!
>* ② 在 CLion 中的快捷键是 `Ctrl + Alt + /` 。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 示例:
2024-10-08 11:44:30 +08:00
2024-10-17 01:20:50 +00:00
```c
2024-10-17 08:56:34 +00:00
#include <stdio.h>
int main() {
/*
printf(1);
printf(2);
*/
printf("你好,世界!!!");
return 0;
}
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
# 第五章: HelloWorld 解读(⭐)
## 5.1 规范的代码风格
### 5.1.1 正确的缩进和空白
* ① 使用一次 `tab` 操作,实现缩进,默认整体向右边移动;如果使用 `shift + tab` 则整体向左移动。
* ② 运算符两边习惯各加一个空格,如:`2 + 4 = 6` 。
2024-10-17 01:20:50 +00:00
> [!NOTE]
2024-10-08 11:44:30 +08:00
>
2024-10-17 08:56:34 +00:00
> 各种 IDE 都有格式化的快捷键, 如: CLion 的格式化快捷键是 `Ctrl + Alt + L` 。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 示例:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
#include <stdio.h>
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
int main() {
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
int a = 1;
int b = 2;
int c = a + b;
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
printf("c = %d", c);
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
return 0;
}
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 5.1.2 代码风格
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 在 C 语言中,有两种代码风格:`行尾风格` 和`次行风格` 。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
>[!NOTE]
>
>看个人爱好,任选一种即可,本人喜欢`行尾分格` ! ! !
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 示例:行尾风格
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
int main(){
if(a > b) {
return a;
} else {
return b;
}
return 0;
}
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 示例:次行风格
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
int main()
{
if(a > b)
{
return a;
}
else
{
return b;
}
return 0;
}
2024-10-17 01:20:50 +00:00
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
## 5.2 代码细节剖析
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 5.2.1 main() 函数
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 在 C 语言中,一个程序或工程可以定义很多函数,但是有且只有一个 main() 函数,作为程序执行的入口,并且在 main() 函数结尾结束整个程序的运行,即:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
int main(){
return 0;
}
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 如果 main() 函数是空括号,即表示 main() 函数不接收任何参数。
* 在 main() 函数之前的 `int` 称为关键字,代表数据类型是`整型` ,它是 main() 函数的返回值的类型,即在执行 main() 函数之后一定会得到一个整数类型的值,即函数值。
2024-10-17 01:20:50 +00:00
> [!NOTE]
>
2024-10-17 08:56:34 +00:00
> * ① 在 C 语言中,人们约定,如果 `return 0`,就表示 main() 函数终止运行,且运行成功;如果返回其它非零整数,则表示运行失败。
> * ② 默认情况下,如果 main() 函数中省略 `return 0` ,则编译器会自动加上。但是,为了保持统一的代码风格,不建议省略。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 5.2.2 函数体
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* ① 一对花括号 `{}` 定义了函数的主体,所有函数都必须以大括号开头和结尾,成对出现。
* ② C 程序中的函数体指的是作为该函数一部分的语句。它可以是任何操作,比如:搜索、排序、打印等。
* ③ 每一个执行语句后面都会有一个英文分号`;` 作为语句结束的标志。
* ④ 一行内可写几条语句,一条语句也可写在几行上。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 5.2.3 printf() 函数
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* printf() 函数的格式,如下所示:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
printf (const char *__format, ...)
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* printf() 函数是产生格式化输出的函数, 作用是将参数文本输出到屏幕, f 表示 format( 格式化) , 表示可以指定输出文本的格式, 即:
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
```c
printf ("Hello World"); // 将字符串输出到控制台,行尾不换行
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* 如果想让光标移动到下一行的开头,可以在输出文本的结尾,可以添加一个换行符 `\n` ,即:
2024-10-17 01:20:50 +00:00
```c
2024-10-17 08:56:34 +00:00
printf("Hello World\n");
```
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
### 5.2.4 标准库和头文件
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
#### 5.2.4.1 概述
* printf() 函数是在标准库的头文件 `stdio.h` 中定义的,要想在程序中使用这个函数,必须在源文件的头部引入该头文件,即:
```c
#include <stdio.h>
2024-10-08 11:44:30 +08:00
```
2024-10-17 08:56:34 +00:00
#### 5.2.4.2 标准库( Standard Library)
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
* C 语言的`标准库` 是由一组函数组成,这些函数提供了许多常用的操作和功能,如:输入输出、字符串处理、内存管理、数学计算等。标准库中的函数由编译器提供,遵循 ANSI C 标准( 如: C89/C90、C99、C11等) 。
* 换言之, C 语言的`标准库` 就是包含函数的实际代码, 这些代码在编译的时候被链接到我们的程序中, 无需手动包含。C 语言的`标准库` 提供了可重用的函数实现,使得程序员不必编写常用的功能。
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
> [!NOTE]
>
> 实际的 printf() 函数的实现代码通常位于标准库的实现文件中,如:在 Linux 中的标准库`libc.so.6` 就包含了 printf() 函数的实现。
2024-10-08 11:44:30 +08:00
2024-10-17 08:56:34 +00:00
#### 5.2.4.3 头文件( Header Files)
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
* `头文件` 是包含函数声明、宏定义、数据类型定义等内容的文件。头文件的作用是为源代码提供必要的声明和定义,以便编译器能够正确解析和链接函数调用。头文件通常以`.h` 作为文件扩展名。
* 换言之,头文件包含函数声明、宏定义和数据类型定义,但不包含函数的实现。头文件告知编译器如何使用标准库中的函数和定义,确保编译时的正确性。头文件需要在源代码文件中使用`#include` 指令显式包含,如:`#include <stdio.h>` 。
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
* 常见的 C 语言头文件及其功能和常用函数、宏等,如下所示:
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
| 头文件 | 功能说明 | 常用函数和宏 |
| ------------- | ---------------------------------------------------------- | ------------------------------------------------------------ |
| **stdio.h** | 标准输入输出库 | `printf` , `scanf` , `fprintf` , `fscanf` , `fopen` , `fclose` , `fgets` , `fputs` |
| **stdlib.h** | 标准库,提供内存分配、程序控制、类型转换、随机数生成等功能 | `malloc` , `free` , `exit` , `atoi` , `atof` , `rand` , `srand` |
| **string.h** | 字符串处理库 | `strlen` , `strcpy` , `strncpy` , `strcat` , `strcmp` , `strstr` , `memset` , `memcpy` |
| **math.h** | 数学库 | `sin` , `cos` , `tan` , `exp` , `log` , `sqrt` , `pow` |
| **time.h** | 时间和日期库 | `time` , `clock` , `difftime` , `mktime` , `strftime` , `localtime` , `gmtime` |
| **ctype.h** | 字符处理库 | `isalnum` , `isalpha` , `isdigit` , `islower` , `isupper` , `tolower` , `toupper` |
| **stdbool.h** | 布尔类型库 | `bool` , `true` , `false` |
| **assert.h** | 断言库 | `assert` |
2024-10-17 01:20:50 +00:00
2024-10-17 08:56:34 +00:00
#### 5.2.4.4 预处理命令
* `#include` 命令的作用是将指定文件的内容插入到包含该命令的源文件中。这通常用于包含头文件,以便使用头文件中声明的函数、宏和数据类型。
* 语法:
```c
// 用于包含标准库头文件或系统头文件。
// 编译器将在系统的标准头文件目录中查找文件。
#include <filename>
```
```c
// 用于包含用户自定义的头文件。
// 编译器首先在当前目录中查找文件,如果未找到,再在标准头文件目录中查找。
#include "filename"
```
2024-10-17 01:20:50 +00:00