c
@ -110,7 +110,7 @@
|
||||
>- ① 存储器越往上速度越快,但是价格越来越贵, 越往下速度越慢,但是价格越来越便宜。
|
||||
>- ② 正是由于计算机各个部件的速度不同,容量不同,价格不同,导致了计算机系统/编程中的各种问题以及相应的解决方案。
|
||||
>
|
||||
>总结:CPU 都是直接和内存打交道的,即:CPU 会直接从内存中读取数据,待数据处理完毕之后,会将结果再次写入到内存中;如果需要将数据持久化(永久)保存(内存是易失性存储器,内存中的数据是以电荷形式存储在存储单元中的。当计算机关闭或断电时,这些电荷很快消散,导致存储在内存中的数据丢失),那么就会内存中的数据再刷新到磁盘或硬盘上,即:落盘。
|
||||
>总结:CPU 都是直接和内存打交道的,即:CPU 会直接从内存中读取数据,待数据处理完毕之后,会将结果再次写入到内存中;如果需要将数据持久化(永久)保存(内存是易失性存储器,内存中的数据是以电荷形式存储在存储单元中的。当计算机关闭或断电时,这些电荷很快消散,导致存储在内存中的数据丢失),那么就需要将内存中的数据再刷新到磁盘或硬盘上,即:落盘。
|
||||
|
||||
## 1.4 计算机软件
|
||||
|
||||
@ -481,7 +481,7 @@ int main() { // 定义主函数
|
||||
> * ② 系统、扎实的学习 C 语言可以让你了解底层硬件、一些简单的数据结构和算法,并培养计算机思维。
|
||||
|
||||
* C 语言是一门通用性的语言,并没有针对某个领域进行优化,在实际项目中,C 语言主要用于比较底层的开发,例如:
|
||||
* Windows、Linux、Unix 等操作系统的内核 90% 以上都使用 C 语言开发(Rust 语言有望未来,在更多的操作系统开发中占据一席之地,特别是在对安全性和性能要求极高的领域)。
|
||||
* Windows、Linux、Unix 等操作系统的内核 90% 以上都使用 C 语言开发(Rust 语言有望未来,在操作系统开发中占据一席之地,特别是在对安全性和性能要求极高的领域)。
|
||||
* 开发硬件驱动,让硬件和操作系统连接起来,这样用户才能更有效的使用硬件。
|
||||
* 单片机和嵌入式属于软硬件的结合,是使用 C 语言最多的地方。
|
||||
* 开发系统组件或服务,用于支撑上层应用。
|
||||
|
Before Width: | Height: | Size: 281 KiB |
Before Width: | Height: | Size: 401 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 785 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 308 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 359 KiB |
Before Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 461 KiB After Width: | Height: | Size: 590 KiB |
Before Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 675 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 288 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/112.gif
Normal file
After Width: | Height: | Size: 821 KiB |
Before Width: | Height: | Size: 54 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/113.png
Normal file
After Width: | Height: | Size: 123 KiB |
Before Width: | Height: | Size: 505 KiB After Width: | Height: | Size: 378 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 461 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 821 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 187 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 378 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 310 KiB |
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 2.0 MiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 308 KiB After Width: | Height: | Size: 572 KiB |
Before Width: | Height: | Size: 359 KiB After Width: | Height: | Size: 1.3 MiB |
Before Width: | Height: | Size: 590 KiB After Width: | Height: | Size: 601 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 681 KiB After Width: | Height: | Size: 681 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 205 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 153 KiB |
Before Width: | Height: | Size: 675 KiB After Width: | Height: | Size: 614 KiB |
Before Width: | Height: | Size: 288 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 821 KiB After Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 378 KiB After Width: | Height: | Size: 209 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 18 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/139.gif
Normal file
After Width: | Height: | Size: 456 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 388 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 379 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 53 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/143.png
Normal file
After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 21 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/145.png
Normal file
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 278 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/147.gif
Normal file
After Width: | Height: | Size: 316 KiB |
Before Width: | Height: | Size: 310 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 290 KiB |
Before Width: | Height: | Size: 2.0 MiB After Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 572 KiB After Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 440 KiB |
Before Width: | Height: | Size: 601 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 232 KiB |
Before Width: | Height: | Size: 205 KiB |
Before Width: | Height: | Size: 536 KiB After Width: | Height: | Size: 536 KiB |
Before Width: | Height: | Size: 153 KiB |
Before Width: | Height: | Size: 614 KiB After Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 401 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 179 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 456 KiB After Width: | Height: | Size: 7.2 MiB |
Before Width: | Height: | Size: 388 KiB After Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 379 KiB After Width: | Height: | Size: 718 KiB |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 926 KiB After Width: | Height: | Size: 926 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 169 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 169 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 278 KiB After Width: | Height: | Size: 393 KiB |
Before Width: | Height: | Size: 316 KiB After Width: | Height: | Size: 758 KiB |
Before Width: | Height: | Size: 290 KiB |
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 440 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 179 KiB |
Before Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 7.2 MiB |
Before Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 718 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 169 KiB |
Before Width: | Height: | Size: 169 KiB |
Before Width: | Height: | Size: 393 KiB |
Before Width: | Height: | Size: 758 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 424 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 424 KiB |
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 3.1 MiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 124 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 786 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 509 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 501 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/58.png
Normal file
After Width: | Height: | Size: 494 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 500 KiB |
Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 502 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 488 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 508 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 261 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 341 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 317 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 280 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 191 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 283 KiB After Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 132 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 786 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 509 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 494 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 502 KiB After Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 488 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 508 KiB After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 193 KiB After Width: | Height: | Size: 193 KiB |
Before Width: | Height: | Size: 261 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/87.gif
Normal file
After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 341 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/88.gif
Normal file
After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 317 KiB |
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 571 KiB After Width: | Height: | Size: 571 KiB |
Before Width: | Height: | Size: 191 KiB |
BIN
docs/notes/01_c-basic/01_xdx/assets/91.gif
Normal file
After Width: | Height: | Size: 505 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 151 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 818 KiB After Width: | Height: | Size: 818 KiB |
Before Width: | Height: | Size: 132 KiB |
Before Width: | Height: | Size: 193 KiB After Width: | Height: | Size: 242 KiB |
Before Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 190 KiB |
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 461 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 187 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 96 KiB |
@ -7,7 +7,6 @@
|
||||
* 要开发 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 |
|
||||
@ -38,11 +37,11 @@
|
||||
>
|
||||
> 下载地址在[这里](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)。
|
||||
|
||||
![](./assets/24.png)
|
||||
![](./assets/1.png)
|
||||
|
||||
* 解压到指定的目录,即:
|
||||
|
||||
![](./assets/25.png)
|
||||
![](./assets/2.png)
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
@ -52,21 +51,21 @@
|
||||
|
||||
* 配置环境变量,以便任意目录都可以执行 gcc 命令,即:
|
||||
|
||||
![](./assets/26.png)
|
||||
![](./assets/3.png)
|
||||
|
||||
![](./assets/27.png)
|
||||
![](./assets/4.png)
|
||||
|
||||
![](./assets/28.png)
|
||||
![](./assets/5.png)
|
||||
|
||||
![](./assets/29.png)
|
||||
![](./assets/6.png)
|
||||
|
||||
![](./assets/30.png)
|
||||
![](./assets/7.png)
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 因为,本人安装 MinGW-w64 的目录是 `D:\develop\mingw64`,所以配置 path 环境变量就需要 `D:\develop\mingw64\bin`。
|
||||
|
||||
![](./assets/31.png)
|
||||
![](./assets/8.png)
|
||||
|
||||
* 测试是否安装成功:
|
||||
|
||||
@ -74,7 +73,7 @@
|
||||
gcc --version
|
||||
```
|
||||
|
||||
![](./assets/32.gif)
|
||||
![](./assets/9.gif)
|
||||
|
||||
### 1.1.3 Cygwin 的安装和配置
|
||||
|
||||
@ -86,47 +85,47 @@ gcc --version
|
||||
>
|
||||
> 下载地址在[这里](https://www.cygwin.com/install.html)。
|
||||
|
||||
![](./assets/33.png)
|
||||
![](./assets/10.png)
|
||||
|
||||
* 点击安装:
|
||||
|
||||
![](./assets/34.png)
|
||||
![](./assets/11.png)
|
||||
|
||||
![](./assets/35.png)
|
||||
![](./assets/12.png)
|
||||
|
||||
![](./assets/36.png)
|
||||
![](./assets/13.png)
|
||||
|
||||
![](./assets/37.png)
|
||||
![](./assets/14.png)
|
||||
|
||||
![](./assets/38.png)
|
||||
![](./assets/15.png)
|
||||
|
||||
![](./assets/39.png)
|
||||
![](./assets/16.png)
|
||||
|
||||
![](./assets/40.png)
|
||||
![](./assets/17.png)
|
||||
|
||||
![](./assets/41.png)
|
||||
![](./assets/18.png)
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 默认是最小化安装,没有 GCC,需要选择 gcc-core、gcc-g++、make、gdb、binutils 。
|
||||
|
||||
![](./assets/42.png)
|
||||
![](./assets/19.png)
|
||||
|
||||
![](./assets/43.png)
|
||||
![](./assets/20.png)
|
||||
|
||||
![](./assets/44.png)
|
||||
![](./assets/21.png)
|
||||
|
||||
![](./assets/45.png)
|
||||
![](./assets/22.png)
|
||||
|
||||
![](./assets/46.png)
|
||||
![](./assets/23.png)
|
||||
|
||||
![](./assets/47.png)
|
||||
![](./assets/24.png)
|
||||
|
||||
![](./assets/48.png)
|
||||
![](./assets/25.png)
|
||||
|
||||
![](./assets/49.png)
|
||||
![](./assets/26.png)
|
||||
|
||||
![](./assets/50.png)
|
||||
![](./assets/27.png)
|
||||
|
||||
#### 1.1.3.2 配置 path 环境变量
|
||||
|
||||
@ -142,23 +141,23 @@ gcc --version
|
||||
>
|
||||
> 下载地址在[这里](https://www.msys2.org/)。
|
||||
|
||||
![](./assets/51.png)
|
||||
![](./assets/28.png)
|
||||
|
||||
* 点击安装:
|
||||
|
||||
![](./assets/52.png)
|
||||
![](./assets/29.png)
|
||||
|
||||
![](./assets/53.png)
|
||||
![](./assets/30.png)
|
||||
|
||||
![](./assets/54.png)
|
||||
![](./assets/31.png)
|
||||
|
||||
![](./assets/55.png)
|
||||
![](./assets/32.png)
|
||||
|
||||
![](./assets/56.png)
|
||||
![](./assets/33.png)
|
||||
|
||||
* 出现命令终端:
|
||||
|
||||
![](./assets/57.png)
|
||||
![](./assets/34.png)
|
||||
|
||||
* 替换清华镜像源(可选):
|
||||
|
||||
@ -166,7 +165,7 @@ gcc --version
|
||||
sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
|
||||
```
|
||||
|
||||
![](./assets/58.gif)
|
||||
![](./assets/35.gif)
|
||||
|
||||
* 安装 gcc 等相关开发包:
|
||||
|
||||
@ -182,7 +181,7 @@ pacman -Sy base-devel --noconfirm # 安装开发工具包
|
||||
pacman -Sy mingw-w64-x86_64-toolchain --noconfirm # 安装开发 gcc 相关工具链
|
||||
```
|
||||
|
||||
![](./assets/59.gif)
|
||||
![](./assets/36.gif)
|
||||
|
||||
#### 1.1.4.2 配置 path 环境变量
|
||||
|
||||
@ -200,73 +199,73 @@ pacman -Sy mingw-w64-x86_64-toolchain --noconfirm # 安装开发 gcc 相关工
|
||||
|
||||
* 鼠标双击,进入安装:
|
||||
|
||||
![](./assets/60.png)
|
||||
![](./assets/37.png)
|
||||
|
||||
* 下一步:
|
||||
|
||||
![](./assets/61.png)
|
||||
![](./assets/38.png)
|
||||
|
||||
* 下一步:
|
||||
|
||||
![](./assets/62.png)
|
||||
![](./assets/39.png)
|
||||
|
||||
* 下一步:
|
||||
|
||||
![](./assets/63.png)
|
||||
![](./assets/40.png)
|
||||
|
||||
* 安装:
|
||||
|
||||
![](./assets/64.png)
|
||||
![](./assets/41.png)
|
||||
|
||||
* 安装完成:
|
||||
|
||||
![](./assets/65.png)
|
||||
![](./assets/42.png)
|
||||
|
||||
#### 1.2.1.3 配置
|
||||
|
||||
* 打开 CLion :
|
||||
|
||||
![](./assets/66.png)
|
||||
![](./assets/43.png)
|
||||
|
||||
* 安装中文插件(可选):
|
||||
|
||||
![](./assets/67.png)
|
||||
![](./assets/44.png)
|
||||
|
||||
![](./assets/68.png)
|
||||
![](./assets/45.png)
|
||||
|
||||
* 配置新 UI :
|
||||
|
||||
![](./assets/69.png)
|
||||
![](./assets/46.png)
|
||||
|
||||
![](./assets/70.png)
|
||||
![](./assets/47.png)
|
||||
|
||||
* 新 UI 配置自定义字体(可选):
|
||||
|
||||
![](./assets/71.png)
|
||||
![](./assets/48.png)
|
||||
|
||||
* 配置`自动保存`功能:
|
||||
|
||||
![](./assets/72.png)
|
||||
![](./assets/49.png)
|
||||
|
||||
* 配置`文件编码` 为 UTF-8:
|
||||
|
||||
![](./assets/73.png)
|
||||
![](./assets/50.png)
|
||||
|
||||
* 配置`控制台编码`为 UTF-8:
|
||||
|
||||
![](./assets/74.png)
|
||||
![](./assets/51.png)
|
||||
|
||||
* 配置`显示方法分隔符`功能:
|
||||
|
||||
![](./assets/75.png)
|
||||
![](./assets/52.png)
|
||||
|
||||
* 配置`编辑器`的字体(可选):
|
||||
|
||||
![](./assets/76.png)
|
||||
![](./assets/53.png)
|
||||
|
||||
* 检测 GCC 工具链是否安装成功:
|
||||
|
||||
![](./assets/77.png)
|
||||
![](./assets/54.png)
|
||||
|
||||
### 1.2.2 VS Code
|
||||
|
||||
@ -282,49 +281,49 @@ pacman -Sy mingw-w64-x86_64-toolchain --noconfirm # 安装开发 gcc 相关工
|
||||
|
||||
* 鼠标双击,进入安装:
|
||||
|
||||
![](./assets/78.png)
|
||||
![](./assets/55.png)
|
||||
|
||||
* 同意协议:
|
||||
|
||||
![](./assets/79.png)
|
||||
![](./assets/56.png)
|
||||
|
||||
* 下一步:
|
||||
|
||||
![](./assets/80.png)
|
||||
![](./assets/57.png)
|
||||
|
||||
* 下一步:
|
||||
|
||||
![](./assets/81.png)
|
||||
![](./assets/58.png)
|
||||
|
||||
* 下一步:
|
||||
|
||||
![](./assets/82.png)
|
||||
![](./assets/59.png)
|
||||
|
||||
* 安装:
|
||||
|
||||
![](./assets/83.png)
|
||||
![](./assets/60.png)
|
||||
|
||||
* 安装过程:
|
||||
|
||||
![](./assets/84.png)
|
||||
![](./assets/61.png)
|
||||
|
||||
* 安装完成:
|
||||
|
||||
![](./assets/85.png)
|
||||
![](./assets/62.png)
|
||||
|
||||
#### 1.2.2.3 配置
|
||||
|
||||
* 安装`中文`插件:
|
||||
|
||||
![](./assets/86.png)
|
||||
![](./assets/63.png)
|
||||
|
||||
![](./assets/87.png)
|
||||
![](./assets/64.png)
|
||||
|
||||
* 安装 `C/C++` 插件:
|
||||
|
||||
![](./assets/88.png)
|
||||
![](./assets/65.png)
|
||||
|
||||
![](./assets/89.png)
|
||||
![](./assets/66.png)
|
||||
|
||||
### 1.2.3 Microsoft Visual Studio
|
||||
|
||||
@ -342,69 +341,69 @@ pacman -Sy mingw-w64-x86_64-toolchain --noconfirm # 安装开发 gcc 相关工
|
||||
|
||||
* 鼠标双击,进入安装:
|
||||
|
||||
![](./assets/90.png)
|
||||
![](./assets/67.png)
|
||||
|
||||
* 继续:
|
||||
|
||||
![](./assets/91.png)
|
||||
![](./assets/68.png)
|
||||
|
||||
* 等待:
|
||||
|
||||
![](./assets/92.png)
|
||||
![](./assets/69.png)
|
||||
|
||||
* 工作负荷(使用 C++ 的桌面开发):
|
||||
|
||||
![](./assets/93.png)
|
||||
![](./assets/70.png)
|
||||
|
||||
* 单个组件:
|
||||
|
||||
![](./assets/94.png)
|
||||
![](./assets/71.png)
|
||||
|
||||
* 语言包:
|
||||
|
||||
![](./assets/95.png)
|
||||
![](./assets/72.png)
|
||||
|
||||
* 安装位置(修改默认的安装位置):
|
||||
|
||||
![](./assets/96.png)
|
||||
![](./assets/73.png)
|
||||
|
||||
* 如果不是第一次安装,可能会出现`共享组件、工具和 SDK`不可以修改,即:
|
||||
|
||||
![](./assets/97.png)
|
||||
![](./assets/74.png)
|
||||
|
||||
* 此时,就需要打开`注册表编辑器`,将如下图中的除了第一个选项,全部删除,然后关闭再重新安装,即:
|
||||
|
||||
![](./assets/98.png)
|
||||
![](./assets/75.png)
|
||||
|
||||
* 开始安装:
|
||||
|
||||
![](./assets/99.png)
|
||||
![](./assets/76.png)
|
||||
|
||||
* 安装中:
|
||||
|
||||
![](./assets/100.png)
|
||||
![](./assets/77.png)
|
||||
|
||||
* 安装完成,然后关闭:
|
||||
|
||||
![](./assets/101.png)
|
||||
![](./assets/78.png)
|
||||
|
||||
#### 1.2.3.3 配置
|
||||
|
||||
* 在开始菜单处,启动 VS :
|
||||
|
||||
![](./assets/102.png)
|
||||
![](./assets/79.png)
|
||||
|
||||
* 登录或跳过该选项(有微软账号就注册,没有就暂时跳过):
|
||||
|
||||
![](./assets/103.png)
|
||||
![](./assets/80.png)
|
||||
|
||||
* 继续:
|
||||
|
||||
![](./assets/104.png)
|
||||
![](./assets/81.png)
|
||||
|
||||
* 注册 VS :
|
||||
|
||||
![](./assets/105.png)
|
||||
![](./assets/82.png)
|
||||
|
||||
* 填写注册码:
|
||||
|
||||
@ -413,19 +412,19 @@ pacman -Sy mingw-w64-x86_64-toolchain --noconfirm # 安装开发 gcc 相关工
|
||||
> * ① Pro 版本:`TD244-P4NB7-YQ6XK-Y8MMM-YWV2J`
|
||||
> * ② Enterprise 版本:`VHF9H-NXBBB-638P6-6JHCY-88JWH`
|
||||
|
||||
![](./assets/106.png)
|
||||
![](./assets/83.png)
|
||||
|
||||
![](./assets/107.png)
|
||||
![](./assets/84.png)
|
||||
|
||||
|
||||
|
||||
# 第二章:HelloWorld(⭐)
|
||||
# 第二章:C 语言入门(HelloWorld,⭐)
|
||||
|
||||
### 2.3.1 手动版
|
||||
## 2.1 手动版
|
||||
|
||||
* ① 新建一个 `HelloWorld.c` 的文件:
|
||||
|
||||
![](./assets/108.png)
|
||||
![](./assets/85.png)
|
||||
|
||||
* ② 通过`记事本`等软件打开该文件,输入如下的代码,并保存:
|
||||
|
||||
@ -438,7 +437,7 @@ int main(){
|
||||
}
|
||||
```
|
||||
|
||||
![](./assets/109.gif)
|
||||
![](./assets/86.gif)
|
||||
|
||||
* ③ 通过 `gcc` 命令编译该文件:
|
||||
|
||||
@ -446,7 +445,7 @@ int main(){
|
||||
gcc HelloWorld.c -o HelloWorld.exe
|
||||
```
|
||||
|
||||
![](./assets/110.gif)
|
||||
![](./assets/87.gif)
|
||||
|
||||
* ④ 执行:
|
||||
|
||||
@ -454,27 +453,27 @@ gcc HelloWorld.c -o HelloWorld.exe
|
||||
./HelloWorld.exe
|
||||
```
|
||||
|
||||
![](./assets/111.gif)
|
||||
![](./assets/88.gif)
|
||||
|
||||
### 2.3.2 VS Code 版
|
||||
## 2.2 VS Code 版
|
||||
|
||||
* ① 新建一个`空`文件夹(目录),用于存放代码:
|
||||
|
||||
![](./assets/112.png)
|
||||
![](./assets/89.png)
|
||||
|
||||
* ② 通过 `vscode` 打开该目录:
|
||||
|
||||
![](./assets/113.gif)
|
||||
![](./assets/90.gif)
|
||||
|
||||
* ③ 在 `vscode` 中新建 `HelloWorld.c` 文件:
|
||||
|
||||
![](./assets/114.gif)
|
||||
![](./assets/91.gif)
|
||||
|
||||
* ④ 设置 VSCode 中 C/C++ 的代码格式为行尾风格(可选):
|
||||
|
||||
![](./assets/115.png)
|
||||
![](./assets/92.png)
|
||||
|
||||
![](./assets/116.png)
|
||||
![](./assets/93.png)
|
||||
|
||||
* ⑤ 编写如下的代码,并保存:
|
||||
|
||||
@ -487,7 +486,7 @@ int main(){
|
||||
}
|
||||
```
|
||||
|
||||
![](./assets/117.gif)
|
||||
![](./assets/94.gif)
|
||||
|
||||
* ⑥ 通过 `gcc` 命令编译该文件:
|
||||
|
||||
@ -495,7 +494,7 @@ int main(){
|
||||
gcc HelloWorld.c -o HelloWorld.exe
|
||||
```
|
||||
|
||||
![](./assets/118.gif)
|
||||
![](./assets/95.gif)
|
||||
|
||||
* ⑦ 执行:
|
||||
|
||||
@ -503,33 +502,33 @@ gcc HelloWorld.c -o HelloWorld.exe
|
||||
./HelloWorld.exe
|
||||
```
|
||||
|
||||
![](./assets/119.gif)
|
||||
![](./assets/96.gif)
|
||||
|
||||
* ⑧ 安装 Code Runner 插件(步骤略),实现右键直接编译执行(可选):
|
||||
|
||||
![](./assets/120.gif)
|
||||
![](./assets/97.gif)
|
||||
|
||||
### 2.3.3 VS 版
|
||||
## 2.3 VS 版
|
||||
|
||||
* ① 新建空项目:
|
||||
|
||||
![](./assets/121.png)
|
||||
![](./assets/98.png)
|
||||
|
||||
![](./assets/122.png)
|
||||
![](./assets/99.png)
|
||||
|
||||
![](./assets/123.png)
|
||||
![](./assets/100.png)
|
||||
|
||||
![](./assets/124.png)
|
||||
![](./assets/101.png)
|
||||
|
||||
* ② 打开`解决方案资源管理器`:
|
||||
|
||||
![](./assets/125.png)
|
||||
![](./assets/102.png)
|
||||
|
||||
![](./assets/126.png)
|
||||
![](./assets/103.png)
|
||||
|
||||
* ③ 新建 `HelloWorld.c` 文件:
|
||||
|
||||
![](./assets/127.gif)
|
||||
![](./assets/104.gif)
|
||||
|
||||
* ④ 编写如下代码,并保存:
|
||||
|
||||
@ -542,21 +541,21 @@ int main(){
|
||||
}
|
||||
```
|
||||
|
||||
![](./assets/128.gif)
|
||||
![](./assets/105.gif)
|
||||
|
||||
* ⑤ 编译和执行:
|
||||
|
||||
![](./assets/129.gif)
|
||||
![](./assets/106.gif)
|
||||
|
||||
### 2.3.4 CLion
|
||||
## 2.4 CLion 版
|
||||
|
||||
* ① 新建空项目:
|
||||
|
||||
![](./assets/130.png)
|
||||
![](./assets/107.png)
|
||||
|
||||
![](./assets/131.png)
|
||||
![](./assets/108.png)
|
||||
|
||||
![](./assets/132.png)
|
||||
![](./assets/109.png)
|
||||
|
||||
* ② 编写如下代码,并保存:
|
||||
|
||||
@ -569,21 +568,21 @@ int main(){
|
||||
}
|
||||
```
|
||||
|
||||
![](./assets/133.gif)
|
||||
![](./assets/110.gif)
|
||||
|
||||
* ③ 编译和运行:
|
||||
|
||||
![](./assets/134.gif)
|
||||
![](./assets/111.gif)
|
||||
|
||||
* ④ 默认情况下,一个项目只能有一个 c 源文件包含 main 函数,但是 CLion 可以有多个,如下:
|
||||
|
||||
![](./assets/135.gif)
|
||||
![](./assets/112.gif)
|
||||
|
||||
* ⑤ 如果之后,有中文乱码问题,那么请做如下步骤:
|
||||
|
||||
![](./assets/136.png)
|
||||
![](./assets/113.png)
|
||||
|
||||
![](./assets/137.gif)
|
||||
![](./assets/114.gif)
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
@ -596,10 +595,110 @@ int main(){
|
||||
|
||||
|
||||
|
||||
# 第三章:注释(⭐)
|
||||
|
||||
|
||||
# 第三章:五花八门的 C 语言编译器(⭐)
|
||||
|
||||
## 3.1 概述
|
||||
|
||||
* 由于 C 语言的历史比较久,而且早期没有规范,整个计算机产业也都处于拓荒的年代,所以就涌现了很多款 C 语言编译器,它们各有特点,适用于不同的平台。
|
||||
|
||||
## 3.2 桌面操作系统
|
||||
|
||||
* 目前而言,主流的桌面操作系统就是 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)~~。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> MSVC 不开源,我们可以使用 Visual Studio Community 社区版,但是如果想使用 Visual Studio Community 社区版生成出来的应用进行商用,就需要好好阅读微软的许可证和说明书了。
|
||||
|
||||
* 对于 Linux 而言,使用的最多的 C/C++ 编译器是 `GCC`(支持多种架构和语言),并且很多 Linux 发行版本都将 GCC 作为默认的编译器,其特点如下所示:
|
||||
* ① **广泛支持**: 支持各种 Linux 发行版,是大多数开源项目的默认编译器。
|
||||
* ② **强大的优化**: 提供各种编译优化选项,适合多种性能需求的开发。
|
||||
* ③ **丰富的工具链**: 和 GDB(GNU 调试器)、Make、Autoconf 等工具无缝集成。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 目前而言,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 的后继者,旨在提供更现代化和更强大的开发工具集。
|
||||
|
||||
|
||||
|
||||
* 对于 MacOS 而言,使用的最多的 C/C++ 编译器是 `Clang/LLVM`,其特点如下:
|
||||
* ① **Xcode 集成**: 深度集成到 Xcode 中,支持 Apple 的所有平台(macOS、iOS、tvOS、watchOS)的开发。
|
||||
* ② **优化和兼容**: 生成的代码针对 Apple 的硬件进行优化,并兼容 GCC 的大部分功能。
|
||||
* ③ **现代化**: Clang 提供了对 C 语言标准的全面支持,并且以其快速的编译速度和易读的错误报告而著称。
|
||||
|
||||
> [!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% 遵守还是部分遵守,并没有强制性的措施,也没有任何约束。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 各个厂商可以为了自己的利益、根据自己的喜好来开发编译器。
|
||||
|
||||
* 这就导致了一个棘手的问题,有的编译器遵守较新的 C 语言标准,有的编译器只能遵守较老的 C 语言标准,有的编译器还进行了很多扩展。比如:
|
||||
* GCC、LLVM/Clang 更新非常及时,能够支持最新的 C 语言标准。
|
||||
* MSVC 更新比较缓慢,迟迟不能支持新标准,例如:VC 6.0、VS2010 都在使用 C89 标准,VS2015 部分支持 C99 标准。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 微软官方给出的答复:最新的标准已经在 C++ 中支持了,C 语言就没必要再重复了。
|
||||
|
||||
* 初学者经常会遇到这种情况,有些代码在 MSVC 下能够正常运行,拿到 GCC 下就不行了,一堆报错信息; 或者反过来,在 GCC 上能运行的代码在 MSVC 下不能运行。这是因为不同的编译器支持的标准不同,每个编译器都进行了自己的扩展,假如你使用了 MSVC 自己的扩展函数,那么拿到 GCC 下肯定是不支持的。
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> 在学习的时候,无所谓使用那个 C 语言编译器了;但是,如果要开发实际项目(开源或商业),最好使用 GCC 编译器,因为其功能最强大、开源、跨平台、免费,支持最新的 C 语言标准。
|
||||
|
||||
|
||||
|
||||
# 第四章:注释(⭐)
|
||||
|
||||
## 4.1 概述
|
||||
|
||||
* 编程语言中,`注释`是一种`特殊`的文本,它不会被编译器执行,而仅用于代码的解释和文档说明。
|
||||
|
||||
>[!NOTE]
|
||||
@ -607,7 +706,7 @@ int main(){
|
||||
>* ① 注释是一个程序员必须有具有的良好编程习惯。
|
||||
>* ② 在实际开发中,程序员可以将自己的思路通过`注释`整理出来,然后再用`代码`去实现。
|
||||
|
||||
## 3.2 单行注释
|
||||
## 4.2 单行注释
|
||||
|
||||
* C 语言中的单行注释的格式,如下所示:
|
||||
|
||||
@ -634,7 +733,7 @@ int main() { // 定义主函数
|
||||
}
|
||||
```
|
||||
|
||||
## 3.3 多行注释
|
||||
## 4.3 多行注释
|
||||
|
||||
* C 语言中的多行注释的格式,如下所示:
|
||||
|
||||
@ -672,11 +771,11 @@ int main() {
|
||||
|
||||
|
||||
|
||||
# 第四章:HelloWorld 的规范(⭐)
|
||||
# 第五章:HelloWorld 的规范(⭐)
|
||||
|
||||
## 4.1 规范的代码风格
|
||||
## 5.1 规范的代码风格
|
||||
|
||||
### 4.1.1 正确的缩进和空白
|
||||
### 5.1.1 正确的缩进和空白
|
||||
|
||||
* ① 使用一次 `tab` 操作,实现缩进,默认整体向右边移动;如果使用 `shift + tab` 则整体向左移动。
|
||||
* ② 运算符两边习惯各加一个空格,如:`2 + 4 = 6`。
|
||||
@ -704,7 +803,7 @@ int main() {
|
||||
}
|
||||
```
|
||||
|
||||
### 4.1.2 代码风格
|
||||
### 5.1.2 代码风格
|
||||
|
||||
* 在 C 语言中,有两种代码风格:`行尾风格`和`次行风格`。
|
||||
|
||||
@ -746,9 +845,9 @@ int main()
|
||||
}
|
||||
```
|
||||
|
||||
## 4.2 代码细节剖析
|
||||
## 5.2 代码细节剖析
|
||||
|
||||
### 4.2.1 main() 函数
|
||||
### 5.2.1 main() 函数
|
||||
|
||||
* 在 C 语言中,一个程序或工程可以定义很多函数,但是有且只有一个 main() 函数,作为程序执行的入口,并且在 main() 函数结尾结束整个程序的运行,即:
|
||||
|
||||
@ -766,14 +865,14 @@ int main(){
|
||||
> * ① 在 C 语言中,人们约定,如果 `return 0`,就表示 main() 函数终止运行,且运行成功;如果返回其它非零整数,则表示运行失败。
|
||||
> * ② 默认情况下,如果 main() 函数中省略 `return 0` ,则编译器会自动加上;但是,为了保持统一的代码风格,不建议省略。
|
||||
|
||||
### 4.2.2 函数体
|
||||
### 5.2.2 函数体
|
||||
|
||||
* ① 一对花括号 `{}` 定义了函数的主体,所有函数都必须以大括号开头和结尾,成对出现。
|
||||
* ② C 程序中的函数体指的是作为该函数一部分的语句。它可以是任何操作,比如:搜索、排序、打印等。
|
||||
* ③ 每一个执行语句后面都会有一个英文分号`;`作为语句结束的标志。
|
||||
* ④ 一行内可写几条语句,一条语句也可写在几行上。
|
||||
|
||||
### 4.2.3 printf() 函数
|
||||
### 5.2.3 printf() 函数
|
||||
|
||||
* printf() 函数的格式,如下所示:
|
||||
|
||||
@ -793,9 +892,9 @@ printf ("Hello World"); // 将字符串输出到控制台,行尾不换行
|
||||
printf("Hello World\n");
|
||||
```
|
||||
|
||||
### 4.2.4 标准库和头文件
|
||||
### 5.2.4 标准库和头文件
|
||||
|
||||
#### 4.2.4.1 概述
|
||||
#### 5.2.4.1 概述
|
||||
|
||||
* printf() 函数是在标准库的头文件 `stdio.h` 中定义的,要想在程序中使用这个函数,必须在源文件的头部引入该头文件,即:
|
||||
|
||||
@ -803,7 +902,7 @@ printf("Hello World\n");
|
||||
#include <stdio.h>
|
||||
```
|
||||
|
||||
#### 4.2.4.2 标准库(Standard Library)
|
||||
#### 5.2.4.2 标准库(Standard Library)
|
||||
|
||||
* C 语言的`标准库`是由一组函数组成,这些函数提供了许多常用的操作和功能,如:输入输出、字符串处理、内存管理、数学计算等。标准库中的函数由编译器提供,遵循 ANSI C 标准(如:C89/C90、C99、C11等)。
|
||||
* 换言之,C 语言的`标准库`就是包含函数的实际代码,这些代码在编译的时候被链接到我们的程序中,无需手动包含。C 语言的`标准库`提供了可重用的函数实现,使得程序员不必编写常用的功能。
|
||||
@ -812,7 +911,7 @@ printf("Hello World\n");
|
||||
>
|
||||
> 实际的 printf() 函数的实现代码通常位于标准库的实现文件中,如:在 Linux 中的标准库`libc.so.6` 就包含了 printf() 函数的实现。
|
||||
|
||||
#### 4.2.4.3 头文件(Header Files)
|
||||
#### 5.2.4.3 头文件(Header Files)
|
||||
|
||||
* `头文件`是包含函数声明、宏定义、数据类型定义等内容的文件。头文件的作用是为源代码提供必要的声明和定义,以便编译器能够正确解析和链接函数调用。头文件通常以`.h`作为文件扩展名。
|
||||
* 换言之,头文件包含函数声明、宏定义和数据类型定义,但不包含函数的实现。头文件告知编译器如何使用标准库中的函数和定义,确保编译时的正确性。头文件需要在源代码文件中使用`#include`指令显式包含,如:`#include <stdio.h>`。
|
||||
@ -830,7 +929,7 @@ printf("Hello World\n");
|
||||
| **stdbool.h** | 布尔类型库 | `bool`, `true`, `false` |
|
||||
| **assert.h** | 断言库 | `assert` |
|
||||
|
||||
#### 4.2.4.4 预处理命令
|
||||
#### 5.2.4.4 预处理命令
|
||||
|
||||
* `#include` 命令的作用是将指定文件的内容插入到包含该命令的源文件中。这通常用于包含头文件,以便使用头文件中声明的函数、宏和数据类型。
|
||||
* 语法:
|
||||
@ -849,16 +948,16 @@ printf("Hello World\n");
|
||||
|
||||
|
||||
|
||||
# 第五章:CLion 高级配置(⭐)
|
||||
# 第六章:CLion 高级配置(⭐)
|
||||
|
||||
## 5.1 安装和配置 WSL2
|
||||
## 6.1 安装和配置 WSL2
|
||||
|
||||
### 5.1.1 概述
|
||||
### 6.1.1 概述
|
||||
|
||||
* WSL 2,全称为 Windows Subsystem for Linux 2,是微软提供的一种技术,允许用户在 Windows 操作系统上运行 Linux 内核。WSL 2 是 WSL 的升级版,它引入了一个真正的 Linux 内核来代替 WSL 1 中使用的兼容层,从而提供更高的性能和更广泛的系统调用支持。
|
||||
* 其架构图,如下所示:
|
||||
|
||||
![](./assets/138.png)
|
||||
![](./assets/115.png)
|
||||
|
||||
* WSL2 的功能,如下所示:
|
||||
* ① **真实的Linux内核**:WSL 2 使用了微软开发的轻量级虚拟机,它包含了一个完整的 Linux 内核。这意味着 WSL 2 能够运行更多的 Linux 应用程序,并且支持更多的系统调用。
|
||||
@ -873,15 +972,15 @@ printf("Hello World\n");
|
||||
* ③ **多平台开发**:对于跨平台开发者来说,WSL 2 允许他们在一个操作系统上同时进行 Windows 和 Linux 平台的开发和测试,提高工作效率。
|
||||
* ④ **运行 Linux 工具和应用程序**:WSL 2 支持在 Windows 上直接运行各种 Linux 工具和应用程序,如:Docker、数据库、编程语言环境等。
|
||||
|
||||
### 5.1.2 WSL2 的安装
|
||||
### 6.1.2 WSL2 的安装
|
||||
|
||||
* ① BIOS 或 UEFI 中,开启虚拟化:步骤略。
|
||||
|
||||
![](./assets/139.png)
|
||||
![](./assets/116.png)
|
||||
|
||||
* ② 查看是否开启了虚拟化:
|
||||
|
||||
![](./assets/140.png)
|
||||
![](./assets/117.png)
|
||||
|
||||
* ③ 启用适用于 Linux 的 Windows 子系统:
|
||||
|
||||
@ -895,7 +994,7 @@ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux
|
||||
|
||||
|
||||
|
||||
![](./assets/141.gif)
|
||||
![](./assets/118.gif)
|
||||
|
||||
* ④ 启用虚拟机功能:
|
||||
|
||||
@ -907,7 +1006,7 @@ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /nores
|
||||
>
|
||||
> 以管理员身份打开 PowerShell 并运行,执行完上述命令之后,如果提示需要重启计算机,那就重启计算机。
|
||||
|
||||
![](./assets/142.gif)
|
||||
![](./assets/119.gif)
|
||||
|
||||
* ⑤ 更新 Linux 内核包:
|
||||
|
||||
@ -919,7 +1018,7 @@ wsl --update
|
||||
>
|
||||
> wsl2 的最新 Linux 内核包托管在 GitHub 上,某些国家可能会污染 Github 相关的域名,那么就需要手动下载,然后安装即可,下载地址在[这里](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)。
|
||||
|
||||
![](./assets/143.gif)
|
||||
![](./assets/120.gif)
|
||||
|
||||
* ⑥ 将 wsl2 设置为默认版本:
|
||||
|
||||
@ -927,7 +1026,7 @@ wsl --update
|
||||
wsl --set-default-version 2
|
||||
```
|
||||
|
||||
![](./assets/144.gif)
|
||||
![](./assets/121.gif)
|
||||
|
||||
* ⑦ 查看官方在线支持的 Linux 版本:
|
||||
|
||||
@ -935,7 +1034,7 @@ wsl --set-default-version 2
|
||||
wsl --list --online
|
||||
```
|
||||
|
||||
![](./assets/145.gif)
|
||||
![](./assets/122.gif)
|
||||
|
||||
* ⑧ 安装指定版本的 Linux :
|
||||
|
||||
@ -947,11 +1046,11 @@ wsl --install Ubuntu-24.04
|
||||
>
|
||||
> 官方支持的 Linux 版本,托管在 Github 上,某些国家可能会污染 Github 的域名;此时,要么走科学上网,要么在 `Microsoft Store` 中搜索并安装。
|
||||
|
||||
![](./assets/146.gif)
|
||||
![](./assets/123.gif)
|
||||
|
||||
* ⑨ 在 Microsoft Store 中搜索并安装(可选):
|
||||
|
||||
![](./assets/147.png)
|
||||
![](./assets/124.png)
|
||||
|
||||
* ⑩ 查询本地安装的 Linux 版本:
|
||||
|
||||
@ -959,9 +1058,9 @@ wsl --install Ubuntu-24.04
|
||||
wsl --list
|
||||
```
|
||||
|
||||
![](./assets/148.gif)
|
||||
![](./assets/125.gif)
|
||||
|
||||
### 5.1.3 配置 WSL2
|
||||
### 6.1.3 配置 WSL2
|
||||
|
||||
* 本人的安装的是 AlmaLinux9 ,所以需要执行如下命令,以便安装 cmake 相关工具链:
|
||||
|
||||
@ -974,13 +1073,13 @@ sudo dnf install make -y # 安装 make
|
||||
sudo dnf install gdb -y # 安装 gdb
|
||||
```
|
||||
|
||||
![](./assets/149.gif)
|
||||
![](./assets/126.gif)
|
||||
|
||||
* 可以通过 CLion 测试是否安装成功:
|
||||
|
||||
![](./assets/150.gif)
|
||||
![](./assets/127.gif)
|
||||
|
||||
### 5.1.4 配置 WSL2
|
||||
### 6.1.4 配置 WSL2
|
||||
|
||||
* 本人的安装的是 Ubuntu 24.04,所以需要执行如下命令,以便安装 cmake 相关工具链:
|
||||
|
||||
@ -992,7 +1091,7 @@ sudo apt install cmake -y # 安装 cmake
|
||||
sudo apt install gdb -y # 安装 gdb
|
||||
```
|
||||
|
||||
![](./assets/151.gif)
|
||||
![](./assets/128.gif)
|
||||
|
||||
* 可以通过 CLion 测试是否安装成功:
|
||||
|
||||
@ -1000,19 +1099,19 @@ sudo apt install gdb -y # 安装 gdb
|
||||
>
|
||||
> 默认仓库中的 GDB 的版本会很高,CLion 会不支持,那么就需要手动下载源码,自行编译,本次不再演示!!!
|
||||
|
||||
![](./assets/152.gif)
|
||||
![](./assets/129.gif)
|
||||
|
||||
## 5.2 切换 CLion 中的 cmake 的工具链
|
||||
## 6.2 切换 CLion 中的 cmake 的工具链
|
||||
|
||||
* 可以在 CLoin 中切换 cmake 的工具链,以便支持不同平台的 cmake ,即:
|
||||
|
||||
![](./assets/153.gif)
|
||||
![](./assets/130.gif)
|
||||
|
||||
## 5.3 修改 CMakeLists.txt 文件
|
||||
## 6.3 修改 CMakeLists.txt 文件
|
||||
|
||||
* 前文也提到了,在一个 C 语言项目中,只能有一个 main() 函数;但是,我们可以修改 `CMakeLists.txt` 文件的内容,以便其支持在一个 C 语言项目中,可以有多个包含 main() 函数的文件,如下所示:
|
||||
|
||||
![](./assets/154.png)
|
||||
![](./assets/131.png)
|
||||
|
||||
* `CMakeLists.txt` 的内容,如下所示:
|
||||
|
||||
@ -1083,11 +1182,11 @@ foreach (SOURCE ${SOURCES})
|
||||
endforeach ()
|
||||
```
|
||||
|
||||
## 5.4 配置 .clang-format 文件
|
||||
## 6.4 配置 .clang-format 文件
|
||||
|
||||
* 配置 `.clang-format` 格式化文件,以便写代码的时候,可以自动保存并格式化 C 程序代码,如下所示:
|
||||
|
||||
![](./assets/155.png)
|
||||
![](./assets/132.png)
|
||||
|
||||
* `.clang-format` 的内容,如下所示:
|
||||
|
||||
@ -1129,13 +1228,13 @@ SpacesInCStyleCastParentheses: false
|
||||
|
||||
* CLion 中配置`保存`的时候`自动格式化`,即:
|
||||
|
||||
![](./assets/156.gif)
|
||||
![](./assets/133.gif)
|
||||
|
||||
## 5.5 配置 .gitignore 文件
|
||||
## 6.5 配置 .gitignore 文件
|
||||
|
||||
* 需要在项目中,配置 `.gitignore` 文件,以便在提交代码到 Git 仓库的时候,忽略某些文件或目录,如下所示:
|
||||
|
||||
![](./assets/157.png)
|
||||
![](./assets/134.png)
|
||||
|
||||
* `.gitignore` 文件的内容,如下所示:
|
||||
|
||||
@ -1146,7 +1245,7 @@ cmake-build-*
|
||||
build
|
||||
```
|
||||
|
||||
## 5.6 演示
|
||||
## 6.6 演示
|
||||
|
||||
* 我们可以在项目中,临时创建或复制一个文件,看上述配置是否生效,即:
|
||||
|
||||
@ -1154,17 +1253,17 @@ build
|
||||
>
|
||||
> 如果是复制并粘贴一个文件到项目中,请点击`重新加载 CMake 项目`!!!
|
||||
|
||||
![](./assets/158.gif)
|
||||
![](./assets/135.gif)
|
||||
|
||||
|
||||
|
||||
# 第六章:C 语言的编译过程(⭐)
|
||||
# 第七章:C 语言的编译过程(⭐)
|
||||
|
||||
## 6.1 概述
|
||||
## 7.1 概述
|
||||
|
||||
* C 程序的编译过程,如下所示:
|
||||
|
||||
![](./assets/159.png)
|
||||
![](./assets/136.png)
|
||||
|
||||
* 过程 ① :编写(编辑)源代码,即:编写 C 语言源程序代码,并以文件的形式存储在磁盘中。
|
||||
|
||||
@ -1205,14 +1304,14 @@ build
|
||||
>
|
||||
> 如果`修改`了源代码,还需要重新`编译`、`链接`,并生成新的 `*.exe`文件,再执行,方能生效。
|
||||
|
||||
## 6.2 GCC 编译器的介绍
|
||||
## 7.2 GCC 编译器的介绍
|
||||
|
||||
* 编辑器,如:vim 、vscode 等,是指我们用它来编写源程序的(编辑代码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。换言之,我们用编辑器编写程序,由编译器编译后才可以运行!
|
||||
* 编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。
|
||||
* gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc 原本作为 GNU 操作系统的官方编译器,现已被大多数类 Unix 操作系统(如:Linux、BSD、Mac OS X 等)采纳为标准的编译器,gcc 同样适用于微软的 Windows 。
|
||||
* gcc 最初用于编译 C 语言,随着项目的发展, gcc 已经成为了能够编译 C、C++、Java、Ada、fortran、Object C、Object C++、Go 语言的编译器大家族。
|
||||
|
||||
## 6.3 通过 gcc 直接生成可执行文件
|
||||
## 7.3 通过 gcc 直接生成可执行文件
|
||||
|
||||
* 示例:进行预处理、编译、汇编和链接
|
||||
|
||||
@ -1220,11 +1319,11 @@ build
|
||||
gcc HelloWorld.c -o HelloWorld.exe
|
||||
```
|
||||
|
||||
![](./assets/160.gif)
|
||||
![](./assets/137.gif)
|
||||
|
||||
## 6.4 通过 gcc 分步编译
|
||||
## 7.4 通过 gcc 分步编译
|
||||
|
||||
### 6.3.1 概述
|
||||
### 7.3.1 概述
|
||||
|
||||
* 预处理命令:
|
||||
|
||||
@ -1250,7 +1349,7 @@ gcc -c 源文件.s -o 源文件.o # 在 Linux 中,通常以 .o 结尾;在 Wi
|
||||
gcc 源文件.o -o 源文件.exe # 在 Linux 中,通常以 .out 结尾;在 Windows 中,通常以 .exe 结尾
|
||||
```
|
||||
|
||||
### 6.4.2 应用示例
|
||||
### 7.4.2 应用示例
|
||||
|
||||
* 示例:只进行预处理
|
||||
|
||||
@ -1258,7 +1357,7 @@ gcc 源文件.o -o 源文件.exe # 在 Linux 中,通常以 .out 结尾;在 W
|
||||
gcc -E HelloWorld.c -o HelloWorld.i
|
||||
```
|
||||
|
||||
![](./assets/161.gif)
|
||||
![](./assets/138.gif)
|
||||
|
||||
|
||||
|
||||
@ -1268,7 +1367,7 @@ gcc -E HelloWorld.c -o HelloWorld.i
|
||||
gcc -S HelloWorld.i -o HelloWorld.s
|
||||
```
|
||||
|
||||
![](./assets/162.gif)
|
||||
![](./assets/139.gif)
|
||||
|
||||
|
||||
|
||||
@ -1278,7 +1377,7 @@ gcc -S HelloWorld.i -o HelloWorld.s
|
||||
gcc -c HelloWorld.s -o HelloWorld.o
|
||||
```
|
||||
|
||||
![](./assets/163.gif)
|
||||
![](./assets/140.gif)
|
||||
|
||||
|
||||
|
||||
@ -1288,15 +1387,15 @@ gcc -c HelloWorld.s -o HelloWorld.o
|
||||
gcc HelloWorld.o -o HelloWorld.exe
|
||||
```
|
||||
|
||||
![](./assets/164.gif)
|
||||
![](./assets/141.gif)
|
||||
|
||||
# 第七章:附录
|
||||
# 第八章:附录
|
||||
|
||||
## 7.1 WSL2 代理问题
|
||||
## 8.1 WSL2 代理问题
|
||||
|
||||
* 在安装和配置 WSL2 之后,可能会出现如下的提示,即:
|
||||
|
||||
![](./assets/166.png)
|
||||
![](./assets/142.png)
|
||||
|
||||
* 那么,只需要修改 `%USERPROFILE%\.wslconfig`文件,内容如下:
|
||||
|
||||
@ -1313,7 +1412,7 @@ bestEffortDnsParsing=true
|
||||
useWindowsDnsCache=true
|
||||
```
|
||||
|
||||
![](./assets/167.png)
|
||||
![](./assets/143.png)
|
||||
|
||||
* 在命令行中,执行如下的命令:
|
||||
|
||||
@ -1321,21 +1420,21 @@ useWindowsDnsCache=true
|
||||
wsl --shutdown
|
||||
```
|
||||
|
||||
![](./assets/168.gif)
|
||||
![](./assets/144.gif)
|
||||
|
||||
* 此时,再打开终端,就没有这种提示了:
|
||||
|
||||
![](./assets/169.png)
|
||||
![](./assets/145.png)
|
||||
|
||||
## 7.2 CLion 调试问题
|
||||
## 8.2 CLion 调试问题
|
||||
|
||||
* 在 CLion 中进行 run(运行)程序的时候,对于 `printf` 函数或 `scanf` 函数很正常,如下所示:
|
||||
|
||||
![](./assets/170.gif)
|
||||
![](./assets/146.gif)
|
||||
|
||||
* 但是,当我们 debug(调试) 的时候,对于 `printf` 函数或 `scanf` 函数会一直没有输出,如下所示:
|
||||
|
||||
![](./assets/171.gif)
|
||||
![](./assets/147.gif)
|
||||
|
||||
* 原因是 `scanf` 函数并不是直接让用户从键盘输入数据,而是先检查缓冲区,处理缓冲区中的数据;当遇到 `scanf` 函数时,程序会先检查输入缓冲区中是否有数据,所以解决方案就是`禁用缓冲区`,如下所示:
|
||||
|
||||
@ -1360,11 +1459,11 @@ int main() {
|
||||
|
||||
* 那么,就会达到我们想要的效果了,如下所示:
|
||||
|
||||
![](./assets/172.gif)
|
||||
![](./assets/148.gif)
|
||||
|
||||
## 7.3 内存泄露检测
|
||||
## 8.3 内存泄露检测
|
||||
|
||||
### 7.3.1 概述
|
||||
### 8.3.1 概述
|
||||
|
||||
* C 语言中的指针是否使用是个颇具争议的话题,现代化的高级编程语言通过各种策略和机制,在编译期就能解决指针危险的问题。但是,遗憾的是,C 语言的指针很大程度上,在运行期才会暴露问题。
|
||||
* 幸运的是,我们可以使用 `Valgrind` 项目来进行`内存泄露检测`和`性能分析`,而 `Valgrind` 只支持 Linux 。
|
||||
@ -1373,7 +1472,7 @@ int main() {
|
||||
>
|
||||
>win 11 中的 WSL2 就是个 Linux 环境,我们可以在上面跑各种 Linux 工具,这样我们就不需要再安装虚拟机软件了,如:VMware Workstation(它会完整的模拟一个硬件系统,并在上面跑各种 Linux ,实在是太笨重了)。
|
||||
|
||||
### 7.3.2 安装
|
||||
### 8.3.2 安装
|
||||
|
||||
* 在 WSL2 上安装 Valgrind :
|
||||
|
||||
@ -1385,7 +1484,7 @@ dnf -y upgrade && dnf -y install valgrind # AlmaLinux
|
||||
apt -y update && apt -y upgrade && apt -y install valgrind # Ubuntu
|
||||
```
|
||||
|
||||
![](./assets/173.gif)
|
||||
![](./assets/149.gif)
|
||||
|
||||
* 查看 valgrind 可执行文件的安装位置:
|
||||
|
||||
@ -1393,17 +1492,17 @@ apt -y update && apt -y upgrade && apt -y install valgrind # Ubuntu
|
||||
which valgrind
|
||||
```
|
||||
|
||||
![](./assets/174.gif)
|
||||
![](./assets/150.gif)
|
||||
|
||||
### 7.3.3 整合
|
||||
### 8.3.3 整合
|
||||
|
||||
* CLion 中将工具链设置为 WSL2 :
|
||||
|
||||
![](./assets/175.gif)
|
||||
![](./assets/151.gif)
|
||||
|
||||
* CLion 中配置 valgrind 的路径:
|
||||
|
||||
![](./assets/176.png)
|
||||
![](./assets/152.png)
|
||||
|
||||
* 查看 WSL2 中 cmake 的版本:
|
||||
|
||||
@ -1411,7 +1510,7 @@ which valgrind
|
||||
cmake --version
|
||||
```
|
||||
|
||||
![](./assets/177.png)
|
||||
![](./assets/153.png)
|
||||
|
||||
* 修改项目中 CMakeLists.txt 中 cmake 的版本:
|
||||
|
||||
@ -1484,21 +1583,21 @@ endforeach ()
|
||||
|
||||
* 在 CLion 中正常运行代码:
|
||||
|
||||
![](./assets/178.gif)
|
||||
![](./assets/154.gif)
|
||||
|
||||
* 在 CLion 中通过 valgrind 运行代码:
|
||||
|
||||
![](./assets/179.gif)
|
||||
![](./assets/155.gif)
|
||||
|
||||
## 7.4 性能分析
|
||||
## 8.4 性能分析
|
||||
|
||||
### 7.4.1 概述
|
||||
### 8.4.1 概述
|
||||
|
||||
* `perf` 是一个 Linux 下的性能分析工具,主要用于监控和分析系统性能。它可以帮助开发者和系统管理员了解系统中哪些部分在消耗资源、识别性能瓶颈以及分析程序的运行效率。
|
||||
|
||||
### 7.4.2 安装
|
||||
### 8.4.2 安装
|
||||
|
||||
#### 7.4.2.1 AlmaLinux9
|
||||
#### 8.4.2.1 AlmaLinux9
|
||||
|
||||
* 在 WSL2 中的 AlmaLinux 安装 perf :
|
||||
|
||||
@ -1506,9 +1605,9 @@ endforeach ()
|
||||
dnf -y install perf
|
||||
```
|
||||
|
||||
![](./assets/180.gif)
|
||||
![](./assets/156.gif)
|
||||
|
||||
#### 7.4.2.2 Ubuntu 22.04
|
||||
#### 8.4.2.2 Ubuntu 22.04
|
||||
|
||||
* 在 WSL2 中的 Ubuntu 安装 perf :
|
||||
|
||||
@ -1517,7 +1616,7 @@ apt -y update \
|
||||
&& apt -y install linux-tools-common linux-tools-generic linux-tools-$(uname -r)
|
||||
```
|
||||
|
||||
![](./assets/181.gif)
|
||||
![](./assets/157.gif)
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
@ -1529,7 +1628,7 @@ apt -y update \
|
||||
uname -sr
|
||||
```
|
||||
|
||||
![](./assets/182.gif)
|
||||
![](./assets/158.gif)
|
||||
|
||||
* 设置环境变量,方便后续引用:
|
||||
|
||||
@ -1537,7 +1636,7 @@ uname -sr
|
||||
export KERNEL_VERSION=$(uname -r | cut -d'-' -f1)
|
||||
```
|
||||
|
||||
![](./assets/183.gif)
|
||||
![](./assets/159.gif)
|
||||
|
||||
* 安装依赖库:
|
||||
|
||||
@ -1551,7 +1650,7 @@ apt -y update && \
|
||||
libelf++0 libbfb0-dev python-dev-is-python3
|
||||
```
|
||||
|
||||
![](./assets/184.gif)
|
||||
![](./assets/160.gif)
|
||||
|
||||
* 下载源码:
|
||||
|
||||
@ -1562,7 +1661,7 @@ git clone \
|
||||
https://github.com/microsoft/WSL2-Linux-Kernel.git
|
||||
```
|
||||
|
||||
![](./assets/185.gif)
|
||||
![](./assets/161.gif)
|
||||
|
||||
* 编译内核代码:
|
||||
|
||||
@ -1574,7 +1673,7 @@ cd WSL2-Linux-Kernel
|
||||
make -j $(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
|
||||
```
|
||||
|
||||
![](./assets/186.gif)
|
||||
![](./assets/162.gif)
|
||||
|
||||
* 编译 perf 工具:
|
||||
|
||||
@ -1586,7 +1685,7 @@ cd tools/perf
|
||||
make clean && make
|
||||
```
|
||||
|
||||
![](./assets/187.gif)
|
||||
![](./assets/163.gif)
|
||||
|
||||
* 复制到 PATH 变量所指向的路径中:
|
||||
|
||||
@ -1594,19 +1693,19 @@ make clean && make
|
||||
cp perf /usr/bin/
|
||||
```
|
||||
|
||||
![](./assets/188.gif)
|
||||
![](./assets/164.gif)
|
||||
|
||||
### 7.4.3 整合
|
||||
### 8.4.3 整合
|
||||
|
||||
* CLion 中配置 perf 的路径:
|
||||
|
||||
![](./assets/189.png)
|
||||
![](./assets/165.png)
|
||||
|
||||
* 在 CLion 中通过 perf 运行代码:
|
||||
|
||||
![](./assets/190.gif)
|
||||
![](./assets/166.gif)
|
||||
|
||||
## 7.5 Win 中文乱码问题
|
||||
## 8.5 Win 中文乱码问题
|
||||
|
||||
* 前文,我们提及到,在 Win 中,如果出现`中文乱码`问题,就需要去`语言和区别`设置`系统区域`的编码为 UTF-8 ;但是,这样可能会造成其它的软件出现中文乱码问题,如:Xshell 等。
|
||||
|
||||
@ -1617,17 +1716,17 @@ cp perf /usr/bin/
|
||||
|
||||
* 其实,还有一种解决方案,如下所示:
|
||||
|
||||
![](./assets/191.png)
|
||||
![](./assets/167.png)
|
||||
|
||||
![](./assets/192.png)
|
||||
![](./assets/168.png)
|
||||
|
||||
![](./assets/193.png)
|
||||
![](./assets/169.png)
|
||||
|
||||
* 测试一下,是否配置成功:
|
||||
|
||||
![](./assets/194.gif)
|
||||
![](./assets/170.gif)
|
||||
|
||||
## 7.6 CLion 中自动导入头文件
|
||||
## 8.6 CLion 中自动导入头文件
|
||||
|
||||
* 在 CLion 中,最为强大的功能就是直接输入函数,然后让 IDE 帮我们自动导入头文件,包括自定义的头文件,相当实用。
|
||||
|
||||
@ -1636,11 +1735,11 @@ cp perf /usr/bin/
|
||||
> * ① CLion 中的`自动导入头文件`的`快捷键`是 `Alt + Enter` 。
|
||||
> * ② CLion 中的`自动提取变量的类型`的`快捷键`是 `Ctrl + Alt + V` 。
|
||||
|
||||
![](./assets/195.gif)
|
||||
![](./assets/171.gif)
|
||||
|
||||
* 开启自动导入头文件的步骤,如下所示:
|
||||
|
||||
![](./assets/196.png)
|
||||
![](./assets/172.png)
|
||||
|
||||
![](./assets/197.png)
|
||||
![](./assets/173.png)
|
||||
|
||||
|