mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
330 lines
219 KiB
JavaScript
330 lines
219 KiB
JavaScript
import{_ as s,c as a,o as i,a6 as n}from"./chunks/framework.CZRoMP2i.js";const l="/c/assets/1.D4a42fT1.jpg",e="/c/assets/2.D2wnxl5F.png",t="/c/assets/3.Dq625oo9.jpg",p="/c/assets/4.uqu1DEK4.png",r="/c/assets/5.C6Q0Q8kf.jpg",c="/c/assets/6.B4Srsb-0.png",h="/c/assets/7._D_c8Lrn.png",d="/c/assets/8.DlIyFGDg.png",o="/c/assets/9.7zkUmpQw.png",k="/c/assets/10.h1ugtjyX.png",u="/c/assets/11.D5PWTabw.png",g="/c/assets/12.Bvs6QYjl.jpg",b="/c/assets/9.7zkUmpQw.png",m="/c/assets/14.CsR5exrN.png",E="/c/assets/15.BRG9GQdT.png",C="/c/assets/16.C2sciGZn.png",y="/c/assets/17.DdyXXyxJ.png",F="/c/assets/18.DIeb_KXW.png",_="/c/assets/19.C-kvMz2p.png",v="/c/assets/20.CQqFxmDa.png",B="/c/assets/21.CjMWyIiX.png",f="/c/assets/22.DFQhcDgs.png",A="/c/assets/23.Cco1vsW8.png",x="/c/assets/24.D60Zf6_d.png",D="/c/assets/25.D2-G6nV2.png",q="/c/assets/26.DpzkVk5V.png",S="/c/assets/27.BXk95GIP.png",w="/c/assets/28.CbWTB08W.png",L="/c/assets/29.twO9TCIg.png",P="/c/assets/30.CKOjeIvS.png",T="/c/assets/31.DKmR0CxE.png",U="/c/assets/32.Cudf77_s.gif",I="/c/assets/33.BBUUlhRC.png",R="/c/assets/34.iLABkB7O.png",N="/c/assets/35.BQuYWOU9.png",W="/c/assets/36.CslpH6j0.png",M="/c/assets/37.BAyvZdKq.png",O="/c/assets/38.C3oC1iUd.png",G="/c/assets/39.Ds-jsEZn.png",X="/c/assets/40.Cd37gMYs.png",V="/c/assets/41.CAw2z3gc.png",H="/c/assets/42.DdPThnr-.png",$="/c/assets/43.q_rvlDnY.png",K="/c/assets/44.JRHg9RZA.png",J="/c/assets/45.Baq-Hb06.png",j="/c/assets/46.c1ht53mu.png",Q="/c/assets/47.CAZmH5Py.png",Y="/c/assets/48.DWeCYBe9.png",z="/c/assets/49.2XM8pYni.png",Z="/c/assets/50.CN0t-fuo.png",ss="/c/assets/51.AcDh3LXQ.png",as="/c/assets/52.CUkDFAc6.png",is="/c/assets/53.picNTNaJ.png",ns="/c/assets/54.DKX92RgJ.png",ls="/c/assets/55.Bxr7QKI3.png",es="/c/assets/56.DuFWsOgW.png",ts="/c/assets/57.Da9qUcfr.png",ps="/c/assets/58.7_gEABSX.gif",rs="/c/assets/59.C2KQYoVC.gif",cs="/c/assets/60.RTUP8Vtx.png",hs="/c/assets/61.Dq21DxwL.png",ds="/c/assets/62.QmpUaNxU.png",os="/c/assets/63.DP0C29gZ.png",ks="/c/assets/64.DwzHokd4.png",us="/c/assets/65.Bi6K26yA.png",gs="/c/assets/66.Bw8DcEQ_.png",bs="/c/assets/67.DPc8Z9rS.png",ms="/c/assets/68.S84xHMTl.png",Es="/c/assets/69.iw3JQUkn.png",Cs="/c/assets/70.ILeJt-HK.png",ys="/c/assets/71.CHgm7khh.png",Fs="/c/assets/72.N1nqJaEg.png",_s="/c/assets/73.DHsnibMi.png",vs="/c/assets/74.BQr6Q0uV.png",Bs="/c/assets/75.BVemi2Lh.png",fs="/c/assets/76.BHR69UXx.png",As="/c/assets/77.CPSU5SJI.png",xs="/c/assets/78.CaQLoDlw.png",Ds="/c/assets/79.aRGy4XbL.png",qs="/c/assets/80.kNO9fmPR.png",Ss="/c/assets/81.D4EkoC4o.png",ws="/c/assets/82.V23Lo9e_.png",Ls="/c/assets/83.Du9LVeMB.png",Ps="/c/assets/84.DdFg75U9.png",Ts="/c/assets/85.C6bz6KtT.png",Us="/c/assets/86.CB6LAhB5.png",Is="/c/assets/87.Bip8bkua.png",Rs="/c/assets/88.DRNHRduW.png",Ns="/c/assets/89.Cth4qqEn.png",Ws="/c/assets/90.DWGWZ64P.png",Ms="/c/assets/91.3hDIDdvx.png",Os="/c/assets/92.Bw_dQ4ap.png",Gs="/c/assets/93.Cn_ubTyA.png",Xs="/c/assets/94.C84EBqwB.png",Vs="/c/assets/95.dZfJY4eR.png",Hs="/c/assets/96.B0zm0Z79.png",$s="/c/assets/97.CaTcEy1Q.png",Ks="/c/assets/98.iEc8mo9g.png",Js="/c/assets/99.Co2KxM6t.png",js="/c/assets/100.CaUm8Qhc.png",Qs="/c/assets/101.kOkqIKG6.png",Ys="/c/assets/102.CyeASH-c.png",zs="/c/assets/103.CFdk60La.png",Zs="/c/assets/104.Bhl-0uK_.png",sa="/c/assets/105.Dni9KbXV.png",aa="/c/assets/106.BXx10MCV.png",ia="/c/assets/107.CXcIKX1T.png",na="/c/assets/108.CQ3_QCQT.png",la="/c/assets/109.CQoDRJM5.gif",ea="/c/assets/110.CPfwZvD9.gif",ta="/c/assets/111.bxEomEjU.gif",pa="/c/assets/112.C_onhf2k.png",ra="/c/assets/113.Budj3s38.gif",ca="/c/assets/114.CH8koQdu.gif",ha="/c/assets/115.kUJhxMtg.png",da="/c/assets/116.BJeJJW4_.png",oa="/c/assets/117.BCuK6eJL.gif",ka="/c/assets/118.rKC-z4z-.gif",ua="/c/assets/119.BJE3xxuT.gif",ga="/c/assets/120.DJOq__O0.gif",ba="/c/assets/121.BDt_0fRR.png",ma="/c/assets/122.Bo5OawW8.png",Ea="/c/assets/123.sUWUfl5e.png",Ca="/c/assets/124.BK4jpnB8.png",ya="/c/assets/125.EF8vdbSq.png",Fa="/c/assets/126.DjxdA_Co.png",_a="/c/assets/127.sp68q1hh.gif",va="/c/assets/128.DhMRyxNN.gif",Ba="/c/assets/129.CdcLZM0R.gif",fa="/c/assets/130.D-5AsTTr.png",Aa="/c/assets/131.2RQKmAUa.png",xa="/c/assets/132.CI4xX8SM.png",Da="/c/assets/133.C8QUZ9v3.gif",qa="/c/assets/134.g5tQfhWz.gif",Sa="/c/assets/135.CX0_1NsE.gif",wa="/c/assets/136.BrFJeoK6.png",La="/c/assets/137.58TjSSjH.gif",Pa="/c/assets/138.CgqNV2hL.png",Ta="/c/assets/139.BasYWvkM.png",Ua="/c/assets/140.CjFxJpBr.png",Ia="/c/assets/141.Dm5Jspvp.gif",Ra="/c/assets/142.1krCh8cy.gif",Na="/c/assets/143.DOSyahv7.gif",Wa="/c/assets/144.BHEvX_FI.gif",Ma="/c/assets/145.DFA0g1_d.gif",Oa="/c/assets/146.D50nO5eA.gif",Ga="/c/assets/147.cAvG1Qfq.png",Xa="/c/assets/148.DpakQFWz.gif",Va="/c/assets/149.Bg61j9QI.gif",Ha="/c/assets/150.DPvD9UCw.gif",$a="/c/assets/151.Ceu65U_n.gif",Ka="/c/assets/152.BWPFRK_8.gif",Ja="/c/assets/153.Ct4TfxPf.gif",ja="/c/assets/154.zsKtx_jV.png",Qa="/c/assets/155.3oqDAW0w.png",Ya="/c/assets/156.D9TSeAa9.gif",za="/c/assets/157.CCRgYIVq.png",Za="/c/assets/158.C1t2T6FV.gif",si="/c/assets/159.Rqa4uHq6.png",ai="/c/assets/160.6yQYnjOa.gif",ii="/c/assets/161.hYR9GiiD.gif",ni="/c/assets/162.D3b-QIrA.gif",li="/c/assets/163.DGbA6qsW.gif",ei="/c/assets/164.BToOkxf2.gif",ti="/c/assets/166.C3wekjfY.png",pi="/c/assets/167.CKuuzuQ_.png",ri="/c/assets/168.B4r6Nv14.gif",ci="/c/assets/169.CvbhuZNK.png",hi="/c/assets/170.BPgYm4ZX.gif",di="/c/assets/171.DH2fri13.gif",oi="/c/assets/172.CDDIqy03.gif",ki="/c/assets/173.DCQsqYYC.gif",ui="/c/assets/174.CUjMoXNF.gif",gi="/c/assets/175.BWbajkuB.gif",bi="/c/assets/176.C1JnBDr7.png",mi="/c/assets/177.DwN2p3bo.png",Ei="/c/assets/178.DdSfz-Pf.gif",Ci="/c/assets/179.BMocjVt7.gif",yi="/c/assets/180.BUU-wlaw.gif",Fi="/c/assets/181.ssadIF0D.gif",_i="/c/assets/182.Dq5lLq9v.gif",vi="/c/assets/183.CJ0_loZ8.gif",Bi="/c/assets/184.BPOK9irZ.gif",fi="/c/assets/185.B1eB55rC.gif",Ai="/c/assets/186.VIcU-hkN.gif",xi="/c/assets/187.BM9viRZJ.gif",Di="/c/assets/188.DpMBA1SK.gif",qi="/c/assets/189.DgXuU6LF.png",Si="/c/assets/190.Dnw73s2h.gif",wi="/c/assets/191.SnFXRSaL.png",Li="/c/assets/192.DnoEqOjV.png",Pi="/c/assets/193.BJBdn7pw.png",Ti="/c/assets/194.DXtQWYsM.gif",Ui="/c/assets/195.hcERTQkN.gif",Ii="/c/assets/196.CioraEUv.png",Ri="/c/assets/197.kWHWwnc_.png",ji=JSON.parse('{"title":"第一章:计算机组成原理","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/01_xdx/index.md","filePath":"notes/01_c-basic/01_xdx/index.md","lastUpdated":1723172263000}'),Ni={name:"notes/01_c-basic/01_xdx/index.md"},Wi=n('<h1 id="第一章-计算机组成原理" tabindex="-1">第一章:计算机组成原理 <a class="header-anchor" href="#第一章-计算机组成原理" aria-label="Permalink to "第一章:计算机组成原理""></a></h1><h2 id="_1-1-计算机系统" tabindex="-1">1.1 计算机系统 <a class="header-anchor" href="#_1-1-计算机系统" aria-label="Permalink to "1.1 计算机系统""></a></h2><ul><li>计算机(Computer),俗称<code>"电脑"</code>,是一种能够接收和存储信息,并按照存储在其内部的程序对海量的数据进行自动、高速的处理,然后将处理结果输出的现代化智能电子设备。</li><li>计算机有很多形式,如:台式电脑、笔记本电脑、智能手机、平板电脑等,还有生产环境中提供重要业务支撑的各种服务器。</li></ul><p><img src="'+l+'" alt=""></p><ul><li>一个完整的<code>计算机系统</code>由<code>硬件(Hardware)系统</code>和<code>软件(Software)系统</code>两大部分组成,即:</li></ul><p><img src="'+e+'" alt=""></p><h2 id="_1-2-冯·诺依曼体系结构" tabindex="-1">1.2 冯·诺依曼体系结构 <a class="header-anchor" href="#_1-2-冯·诺依曼体系结构" aria-label="Permalink to "1.2 冯·诺依曼体系结构""></a></h2><ul><li><code>冯·诺依曼</code>是一位多才多艺的科学家,他在数学、物理学、计算机科学、经济学等领域都有杰出的贡献。</li></ul><p><img src="'+t+'" alt=""></p><ul><li><code>冯·诺依曼</code>的主要成就: <ul><li>在计算机科学领域的最著名贡献是提出了<code>冯·诺依曼</code>体系结构(1946 年),这是<code>现代计算机设计的基础</code>。</li><li>促进了计算机的可编程性和通用性,使得计算机能够执行各种复杂的任务。</li><li>对核武器设计、自动化控制系统、人工智能等领域的发展产生了重要影响。</li><li>……</li></ul></li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p><code>冯·诺依曼体系结构</code>是现代计算机(量子计算机除外)设计的<code>基础</code>。</p></div><ul><li><p><code>冯·诺依曼</code>体系结构的理论要点如下:</p><ul><li><p>① <strong>存储程序</strong>:<code>程序指令</code>和<code>数据</code>都存储在计算机的内存中,这使得程序可以在运行时修改。</p></li><li><p>② <strong>二进制逻辑</strong>:所有<code>数据</code>和<code>指令</code>都以<code>二进制</code>形式表示。</p></li><li><p>③ <strong>顺序执行</strong>:指令按照它们在内存中的顺序执行,但可以有条件地改变执行顺序。</p></li><li><p>④ <strong>五大部件</strong>:计算机由<code>运算器</code>、<code>控制器</code>、<code>存储器</code>、<code>输入设备</code>和<code>输出设备</code>组成。</p></li><li><p>⑤ <strong>指令结构</strong>:指令由操作码和地址码组成,操作码指示要执行的操作,地址码指示操作数的位置。</p></li><li><p>⑥ <strong>中心化控制</strong>:计算机的控制单元(CPU)负责解释和执行指令,控制数据流。</p></li></ul></li></ul><p><img src="'+p+'" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>上述的组件协同工作,构成了一个完整的计算机系统:</p><ul><li><strong>运算器</strong>和<strong>控制器</strong>通常被集成在一起,组成中央处理器(CPU),负责数据处理和指令执行。</li><li><strong>存储器</strong>保存数据和程序,是计算机运作的基础。</li><li><strong>输入设备</strong>和<strong>输出设备</strong>负责与外界的交互,确保用户能够输入信息并接收计算机的处理结果。</li></ul></div><h2 id="_1-3-各种硬件处理速度和性能优化" tabindex="-1">1.3 各种硬件处理速度和性能优化 <a class="header-anchor" href="#_1-3-各种硬件处理速度和性能优化" aria-label="Permalink to "1.3 各种硬件处理速度和性能优化""></a></h2><ul><li>计算机的性能短板:如果 CPU 有每秒处理 1000 个服务请求的能力,各种总线的负载能力能达到 500 个, 但网卡只能接受 200个请求,而硬盘只能负担 150 个的话,那这台服务器得处理能力只能是 150 个请求/ 秒,有 85% 的处理器计算能力浪费了,在计算机系统当中,<code>硬盘</code>的读写速率已经成为影响系统性能进一 步提高的瓶颈。</li></ul><p><img src="'+r+'" alt="img"></p><ul><li>计算机的各个设备部件的延迟从高到低的排列,依次是机械硬盘(HDD)、固态硬盘(SSD)、内存、CPU 。</li></ul><p><img src="'+c+`" alt="img"></p><ul><li>从上图中,我们可以知道,CPU 是最快的,一个时钟周期是 0.3 ns ,内存访问需要 120 ns ,固态硬盘访问需要 50-150 us,传统的硬盘访问需要 1-10 ms,而网络访问是最慢,需要 40 ms 以上。</li><li>时间的单位换算如下:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>1 秒 = 1000 毫秒,即 1 s = 1000 ms。</span></span>
|
||
<span class="line"><span>1 毫秒 = 1000 微妙,即 1 ms = 1000 us 。</span></span>
|
||
<span class="line"><span>1 微妙 = 1000 纳秒,即 1 us = 1000 ns。</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ul><li>按照上图,将计算机世界的时间和人类世界的时间进行对比,即:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>如果 CPU 的时钟周期按照 1 秒计算,</span></span>
|
||
<span class="line"><span>那么,内存访问就需要 6 分钟;</span></span>
|
||
<span class="line"><span>那么,固态硬盘就需要 2-6 天;</span></span>
|
||
<span class="line"><span>那么,传统硬盘就需要 1-12 个月;</span></span>
|
||
<span class="line"><span>那么,网络访问就需要 4 年以上。</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><ul><li>所以,对于 CPU 来说,这个世界真的是太慢了!!!</li><li>其实,中国古代中的文人,通常以<code>蜉蝣</code>来表示时间的短暂(和其他生物的寿命比),也是类似的道理,即:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>鹤寿千岁,以极其游,蜉蝣朝生而暮死,尽其乐,盖其旦暮为期,远不过三日尔。</span></span>
|
||
<span class="line"><span> --- 出自 西汉淮南王刘安《淮南子》</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>寄蜉蝣于天地,渺沧海之一粟。 哀吾生之须臾,羡长江之无穷。 </span></span>
|
||
<span class="line"><span>挟飞仙以遨游,抱明月而长终。 知不可乎骤得,托遗响于悲风。</span></span>
|
||
<span class="line"><span> --- 出自 苏轼《赤壁赋》</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>对于<code>蜉蝣</code>来说,从早到晚就是一生;而对于我们<code>人类</code>而言,却仅仅只是一天。</p></div><ul><li>存储器的层次结构(CPU 中也有存储器,即:寄存器、高速缓存 L1、L2 和 L3),如下所示:</li></ul><p><img src="`+h+'" alt="img"></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>上图以层次化的方式,展示了价格信息,揭示了一个真理,即:天下没有免费的午餐(千万不要相信别人会有发财的机会和你共享,人都是自私的,你算个啥?为什么要找你?)</p><ul><li>① 存储器越往上速度越快,但是价格越来越贵, 越往下速度越慢,但是价格越来越便宜。</li><li>② 正是由于计算机各个部件的速度不同,容量不同,价格不同,导致了计算机系统/编程中的各种问题以及相应的解决方案</li></ul></div><h2 id="_1-4-计算机软件" tabindex="-1">1.4 计算机软件 <a class="header-anchor" href="#_1-4-计算机软件" aria-label="Permalink to "1.4 计算机软件""></a></h2><h3 id="_1-4-1-操作系统的来源" tabindex="-1">1.4.1 操作系统的来源 <a class="header-anchor" href="#_1-4-1-操作系统的来源" aria-label="Permalink to "1.4.1 操作系统的来源""></a></h3><ul><li>在上古时期,硬件资源不够丰富,计算机设计的也非常简陋。那个时候,很多应用程序都是直接跑在硬件上的,即:一个计算机只能跑一个应用程序。</li></ul><p><img src="'+d+'" alt=""></p><ul><li>随着技术的发展,硬件越来越丰富,功能也越来越强大,性能也越来越好。这种情况下,如果一台计算机只能跑一个程序,实在是太浪费了。而且,底层硬件不断丰富,应用程序需要对接的硬件也将越来越多,如果每个应用程序都这么干,不显示工作很重复吗?于是,操作系统应运而生了。</li></ul><p><img src="'+o+'" alt=""></p><ul><li>操作系统的功能: <ul><li>硬件驱动。</li><li>进程管理。</li><li>内存管理。</li><li>网络管理。</li><li>安全管理。</li><li>文件管理。</li></ul></li></ul><ul><li>那么,操作系统的作用,就是这样的,即: <ul><li>对下,管理计算机的硬件资源。</li><li>对上,提供使用计算机资源的操作方式,有: <ul><li><code>系统调用</code>:是一套已经写好的代码接口,应用程序通过调用这些接口来请求操作系统执行特定的硬件操作。它们直接与硬件交互,提供底层功能支持,如:文件操作、进程管理、内存管理等。<code>开发者</code>通过系统调用可以实现对底层资源的直接控制,确保程序能够高效、安全地运行。</li><li><code>终端命令</code>:是一种文本命令接口,通过命令行输入各种指令来控制操作系统和软件的行为。终端命令可以执行文件操作、系统配置、网络管理等各种任务。主要针对<code>开发人员</code>和<code>高级用户</code>,他们通过命令行可以快速、精确地完成各种操作,提高工作效率。</li><li><code>图形用户界面</code>(GUI)是通过图形元素(如:窗口、图标、按钮等)与用户进行交互的界面。供直观、易用的操作方式,使用户能够通过鼠标点击、拖拽等简单操作完成复杂任务。主要面向<code>普通用户</code>,降低了计算机操作的门槛,提高了用户体验和工作效率。</li></ul></li></ul></li></ul><p><img src="'+k+'" alt=""></p><h3 id="_1-4-2-用户态和内核态" tabindex="-1">1.4.2 用户态和内核态 <a class="header-anchor" href="#_1-4-2-用户态和内核态" aria-label="Permalink to "1.4.2 用户态和内核态""></a></h3><ul><li>在现代操作系统中,<code>用户态(User Mode)</code>和<code>内核态(Kernel Mode)</code>是两种不同的执行模式,它们对系统资源的访问权限有着本质的区别。这种区分是为了提供一个稳定和安全的运行环境,防止用户程序直接操作硬件设备和关键的系统资源,从而可能引起系统的不稳定或安全问题。</li></ul><p><img src="'+u+`" alt=""></p><ul><li>核态(Kernel Mode) VS 用户态(User Mode):</li></ul><table tabindex="0"><thead><tr><th style="text-align:left;">类型</th><th style="text-align:left;">内核态(Kernel Mode)</th><th style="text-align:left;">用户态(User Mode)</th></tr></thead><tbody><tr><td style="text-align:left;">权限</td><td style="text-align:left;">内核态是操作系统代码运行的模式,拥有访问系统全部资源和执行硬件操作的<code>最高权限</code>。在这种模式下,操作系统的核心部分可以直接访问内存、硬件设备控制、管理文件系统和网络通信等。</td><td style="text-align:left;">用户态是普通应用程序运行的模式,具有<code>较低</code>的系统资源访问权限。在用户态,程序不能直接执行硬件操作,必须通过操作系统提供的接口(即系统调用)来请求服务。</td></tr><tr><td style="text-align:left;">安全性</td><td style="text-align:left;">由于内核态具有如此高的权限,因此只有可信的、经过严格审查的操作系统核心组件才被允许在此模式下运行。这样可以保护系统不被恶意软件破坏。</td><td style="text-align:left;">用户态为系统提供了一层保护,确保用户程序不能直接访问关键的系统资源,防止系统崩溃和数据泄露。</td></tr><tr><td style="text-align:left;">功能</td><td style="text-align:left;">内核态提供了<code>系统调用</code>的接口,允许用户态程序安全地请求使用操作系统提供的服务,比如:文件操作、网络通信、内存管理等。</td><td style="text-align:left;">用户态保证了操作系统的稳定性和安全性,同时也使得多个程序可以在相互隔离的环境中同时运行,避免相互干扰。</td></tr></tbody></table><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① 操作系统通过用户态和内核态的分离,实现了对系统资源的保护和控制。</li><li>② 当用户程序需要进行文件读写、网络通信或其他需要操作系统介入的操作时,会发生从用户态到内核态的切换。这通过系统调用(System Call)实现,系统调用是用户程序与操作系统内核通信的桥梁。</li><li>③ 执行完毕后,系统从内核态返回用户态,继续执行用户程序。</li><li>④ 用户态和内核态的这种分离设计是现代操作系统中实现安全、稳定运行的关键机制之一。</li></ul></div><ul><li>示例:</li></ul><div class="language-java vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> java.io.IOException;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> java.nio.file.Files;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> java.nio.file.Path;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> java.nio.file.Paths;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> java.util.List;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Demo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> static</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> writeFile</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(String </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">filePath</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, String </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">content</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Path path </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Paths.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(filePath);</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Files.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">write</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(path, content.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getBytes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">());</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (IOException </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">e</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printStackTrace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> static</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[] </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">args</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">){</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 20</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string filePath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "c:/demo.txt"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string txt </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> writeFile</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(filePath, a); </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 从用户态切换到内核态完成文件写入</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(a); </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 从内核态切换回用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(b); </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(c); </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用户态</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br></div></div><h3 id="_1-4-3-isa、abi-和-api" tabindex="-1">1.4.3 ISA、ABI 和 API <a class="header-anchor" href="#_1-4-3-isa、abi-和-api" aria-label="Permalink to "1.4.3 ISA、ABI 和 API""></a></h3><ul><li>ISA 、ABI 和 API 的参考模型如下:</li></ul><p><img src="`+g+'" alt=""></p><ul><li>在底层,硬件模型以指令集架构 (ISA) 表示,该架构定义了处理器、寄存器、存储器和中断管理的指令集。ISA 是硬件和软件之间的接口,对于操作系统 (OS) 开发人员 (System ISA) 和直接管理底层硬件的应用程序 (User ISA) 的开发人员来说非常重要。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① ISA 是计算机体系结构中定义的一组指令,它规定了处理器能够执行的操作。ISA 包括指令的编码、寄存器的使用、内存访问模式等。不同的处理器可能有不同的 ISA,例如:x86、ARM、MIPS 等。</li><li>② 在设计一个新的操作系统时,开发者需要确保操作系统能够支持特定的 ISA ,以便在特定的硬件上运行。例如:如果操作系统旨在运行在 ARM 架构的处理器上,那么它必须能够理解和执行 ARM ISA 定义的指令集。</li></ul></div><ul><li>应用程序二进制接口 (ABI) 将<code>操作系统层</code>与由操作系统管理的<code>应用程序</code>和<code>库</code>分开。ABI 涵盖了低级数据类型、对齐方式和调用约定等详细信息,并定义了可执行程序的格式。系统调用在此级别定义。此接口允许应用程序和库在实现相同 ABI 的操作系统之间移植。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① ABI 是指在二进制级别上,应用程序与操作系统、库或应用程序的不同部分之间的接口。它定义了数据类型的大小、布局、对齐方式,以及函数调用的约定(如参数如何传递、返回值如何处理等)。ABI 确保了编译后的二进制文件能够在特定的操作系统和硬件平台上正确地运行。</li><li>② 在 windows 上的应用程序的运行格式是:<code>PE</code>(portable executable)格式、<code>.dll</code> (dynamic link library)格式和 <code>.lib</code> 格式;而在 Linux 上的应用程序的运行格式是:<code>ELF</code>(executable and linking format)格式、<code>.so</code> (shared object)格式和 <code>.a</code> 格式。</li><li>③ 在 Linux 中可以通过 <code>file /bin/ls</code> 命令查看指定可执行应用程序的 ABI 格式;从而也可以论证,在 Windows 上可以运行的程序,在 Linux 上运行不了。</li><li>④ 当开发者在 Linux 系统上编写 C 语言程序,并使用特定的编译器(如:GCC)编译时,编译器会遵循 Linux 平台的 ABI 规范来生成二进制文件。这样,生成的可执行文件就可以在任何遵循相同 ABI 规范的 Linux 系统上运行。</li><li>⑤ 如果一个应用程序需要跨平台(操作系统)运行,就需要使用<code>一套代码,多平台编译</code>的方式(针对 C 或 C++ 等),即:相同的源代码,在不同平台(操作系统)上使用特定平台的编译器(如:GCC)来分别编译成符合自己平台的 ABI 规范的二进制文件。</li></ul></div><ul><li>最高级别的抽象由应用程序编程接口 (API) 表示,它将<code>应用程序</code>连接到<code>库</code>或<code>底层操作系统</code>。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① API 是一组预定义的函数、协议和工具,用于构建软件和应用程序。API 允许不同的软件系统相互交互,它定义了软件组件之间如何相互通信。API 可以是库、框架、协议或服务。</li><li>② 在 Web 开发中,开发者可能会使用 JavaScript 的 Fetch API 来与服务器进行通信,获取数据或提交表单。这个 API 提供了一种标准化的方式来发送 HTTP 请求和处理响应,而不需要开发者关心底层的网络协议细节。</li></ul></div><h3 id="_1-4-4-系统调用-system-call-和函数库-library-call" tabindex="-1">1.4.4 系统调用(System Call)和函数库(Library Call) <a class="header-anchor" href="#_1-4-4-系统调用-system-call-和函数库-library-call" aria-label="Permalink to "1.4.4 系统调用(System Call)和函数库(Library Call)""></a></h3><ul><li>在现代操作系统中,应用程序都不能直接作用于硬件,而是运行在操作系统之上。</li></ul><p><img src="'+b+'" alt=""></p><ul><li>并且,在上文的图示中,我们也会看到<code>系统调用(System Call)</code>和<code>函数库(Library Call)</code>的身影,如下:</li></ul><p><img src="'+m+'" alt=""></p><p><img src="'+E+`" alt=""></p><ul><li>其实,<code>系统调用(System Call)</code>和<code>函数库(Library Call)</code>的区别如下:</li></ul><table tabindex="0"><thead><tr><th style="text-align:left;">类型</th><th style="text-align:left;">系统调用(System Call)</th><th style="text-align:left;">函数库(Library Call)</th></tr></thead><tbody><tr><td style="text-align:left;">定义</td><td style="text-align:left;">系统调用是操作系统提供给程序员的一组接口,这些接口允许用户空间的程序请求操作系统内核提供的服务,比如文件操作、进程控制、通信和内存管理等。</td><td style="text-align:left;">函数库调用是指使用高级语言编写的一组预先编译好的函数,这些函数实现了一些常用的功能,比如:字符串处理、数学计算等。程序员可以在自己的程序中直接调用这些函数,而无需重新实现它们。</td></tr><tr><td style="text-align:left;">权限</td><td style="text-align:left;">执行系统调用时,会从用户态切换到内核态。这是因为系统调用涉及到访问受保护的系统资源,这些操作必须由操作系统控制以确保系统的稳定性和安全性。</td><td style="text-align:left;">函数库调用通常在用户态执行,不涉及到用户态与内核态之间的切换。它们直接使用操作系统通过系统调用提供的服务,或者完全在用户空间内完成计算,不需要操作系统介入。</td></tr><tr><td style="text-align:left;">性能开销</td><td style="text-align:left;">由于涉及到用户态与内核态之间的切换,系统调用的执行成本相对较高。因此,频繁的系统调用可能会影响程序的性能。</td><td style="text-align:left;">相对于系统调用,函数库调用的性能开销较小。因为它们通常不涉及到模式切换,且执行的操作多在用户空间完成。</td></tr><tr><td style="text-align:left;">示例</td><td style="text-align:left;">open(),read(),write(),fork(),exec() 等 UNIX/Linux 系统调用。</td><td style="text-align:left;">C 标准库中的 printf() 等函数;数学库中的 sin(),cos() 等函数。</td></tr></tbody></table><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① <strong>执行层级</strong>:系统调用直接与操作系统内核交互,执行更底层的操作;而函数库调用运行在用户空间,通常使用系统调用来实现其功能。</li><li>② <strong>性能开销</strong>:系统调用由于涉及到用户态与内核态的切换,性能开销相对较大;函数库调用则因为主要在用户态执行,性能开销较小。</li><li>③ <strong>使用目的</strong>:系统调用提供了访问操作系统资源和服务的能力;函数库调用则提供了方便、高效执行常见任务的手段。</li></ul></div><h1 id="第二章-初识计算机语言" tabindex="-1">第二章:初识计算机语言 <a class="header-anchor" href="#第二章-初识计算机语言" aria-label="Permalink to "第二章:初识计算机语言""></a></h1><h2 id="_2-1-计算机语言是什么" tabindex="-1">2.1 计算机语言是什么? <a class="header-anchor" href="#_2-1-计算机语言是什么" aria-label="Permalink to "2.1 计算机语言是什么?""></a></h2><ul><li><code>人类语言</code>是人和人之间用于沟通的一种方式,例如:中国人和中国人之间使用普通话沟通,而中国人和美国人交流,则可以使用英语。</li><li><code>计算机编程语言</code>是人和计算机交流的方式。人们可以使用<code>编程语言</code>对计算机下达<code>命令(指令)</code>,让计算机完成人们需要的功能。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>计算机语言有很多种,如:C、C++、Java、Go、JavaScript、Python、Scala 等。</p></div><h2 id="_2-2-为什么要学习计算机语言" tabindex="-1">2.2 为什么要学习计算机语言? <a class="header-anchor" href="#_2-2-为什么要学习计算机语言" aria-label="Permalink to "2.2 为什么要学习计算机语言?""></a></h2><ul><li>编程语言到底是什么?编程语言就是由文字和符号组成的,如:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 这是编译预处理指令</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 定义主函数</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"你好,世界!!!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 输出所指定的一行信息</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 函数执行完毕时返回函数值0</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><ul><li>编程语言就是用于控制计算机,让其完成我们需要的功能。而我们学习编程语言,其实就是学习这些文字和符号编写的规则。</li><li>因为 CPU 只能识别二进制的指令,而我们<code>编写</code>的程序叫做<code>源代码</code>,是人类能看懂;但是,计算机却不能识别。那么,我们就需要让计算机能识别我们编写的源程序,就需要将我们编写的源代码交给编译器程序,其会帮助我们将所编写的源代码转换为计算机能够识别的二进制指令。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>编译器就是运行在操作系统之上的程序,其作用就是用来将程序员编写的源代码转换为计算机能够识别的二进制指令。</p></div><ul><li>如果我们用 Java 语言编写了程序(源代码),那么编写的程序也是不能直接运行的,需要通过 Java 语言的编译器将 Java 程序编译为计算机能够识别的二进制指令。</li><li>如果我们用 Python 语言编写了程序(源代码),那么编写的程序也是不能直接运行的,需要通过 Python 语言的编译器将 Python 程序编译为计算机能够识别的二进制指令。</li><li>……</li><li>总而言之,无论我们学习任何一门编程语言,想要将程序运行起来,都必须做如下的两件事情: <ul><li>① 学习该语言的文字和符号编写的规则,即:<code>语法规则</code>。</li><li>② 需要在操作系统上安装对应编程语言的<code>编译器</code>程序,将源程序编译为计算机能够识别的二进制指令。</li></ul></li></ul><h2 id="_2-3-计算机语言简史" tabindex="-1">2.3 计算机语言简史 <a class="header-anchor" href="#_2-3-计算机语言简史" aria-label="Permalink to "2.3 计算机语言简史""></a></h2><h3 id="_2-3-1-机器语言-相当于人类的石器时代" tabindex="-1">2.3.1 机器语言(相当于人类的石器时代) <a class="header-anchor" href="#_2-3-1-机器语言-相当于人类的石器时代" aria-label="Permalink to "2.3.1 机器语言(相当于人类的石器时代)""></a></h3><ul><li>1946 年 2 月 14 日,世界上第一台计算机 <code>ENIAC</code> 诞生,使用的是最原始的<code>穿透卡片</code>。</li></ul><p><img src="`+C+`" alt=""></p><ul><li>这种卡片使用的是用<code>二进制代码</code>表示的语言,和人类语言差别极大,这种语言就称为<code>机器语言</code>,如:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>0000,0000,000000010000 代表 LOAD A, 16</span></span>
|
||
<span class="line"><span>0000,0001,000000000001 代表 LOAD B, 1</span></span>
|
||
<span class="line"><span>0001,0001,000000010000 代表 STORE B, 16</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ul><li>这种语言本质上是计算机能识别的<code>唯一语言</code>,人类很难理解;换言之,当时的程序员 99.9% 都是异类!!!</li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>不同类型(CPU 架构,如:x86_64、arm 等)的处理器有不同的机器语言指令集,指令集架构(ISA)决定了机器语言的具体形式;换言之,机器语言与特定硬件架构紧密相关,机器语言程序几乎没有可移植性。</p></div><h3 id="_2-3-2-汇编语言-相当于人类的青铜-铁器时代" tabindex="-1">2.3.2 汇编语言(相当于人类的青铜&铁器时代) <a class="header-anchor" href="#_2-3-2-汇编语言-相当于人类的青铜-铁器时代" aria-label="Permalink to "2.3.2 汇编语言(相当于人类的青铜&铁器时代)""></a></h3><ul><li><code>汇编语言</code>使用<code>助记符</code>(如:MOV、ADD、SUB)代替二进制操作码,使程序更易于人类编写和理解;因此,<code>汇编语言</code>也被称为<code>符号语言</code>。</li></ul><p><img src="`+y+'" alt=""></p><ul><li>汇编语言的<code>优点</code>是能编写<code>高效率</code>的程序;但是,<code>缺点</code>和机器语言没什么不同,汇编语言同样<code>依赖于具体的计算机架构(面向机器)</code>,程序不具备跨平台的可移植性。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>汇编语言,目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。</p></div><h3 id="_2-3-3-高级语言-相当于人类的信息时代" tabindex="-1">2.3.3 高级语言(相当于人类的信息时代) <a class="header-anchor" href="#_2-3-3-高级语言-相当于人类的信息时代" aria-label="Permalink to "2.3.3 高级语言(相当于人类的信息时代)""></a></h3><ul><li><code>高级语言</code>是一种<code>接近于人们使用习惯</code>的程序设计语言。<code>它允许程序员使用接近日常英语的指令来编写程序</code>,程序中的符号和算式也和<code>日常使用的数学公式</code>差不多,接近于自然语言和数学语言,容易被人们掌握。</li></ul><p><img src="'+F+'" alt=""></p><ul><li>高级语言<code>独立于计算机硬件</code>,有一定的通用性;计算机不能直接识别和执行用高级语言编写的程序,需要使用<code>编译器</code>或<code>解释器</code>转换为机器语言,才能被计算机识别和执行。</li></ul><p><img src="'+_+'" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>普遍使用的高级编程语言,有:C、C++、Java、Python、C#、JavaScript、Go、SQL 等。</p></div><h3 id="_2-3-4-总结" tabindex="-1">2.3.4 总结 <a class="header-anchor" href="#_2-3-4-总结" aria-label="Permalink to "2.3.4 总结""></a></h3><ul><li>编写语言的对比,如下所示:</li></ul><table tabindex="0"><thead><tr><th style="text-align:left;">类别</th><th style="text-align:left;">特征</th><th style="text-align:left;">优点</th><th style="text-align:left;">缺点</th><th style="text-align:left;">示例</th></tr></thead><tbody><tr><td style="text-align:left;"><strong>机器语言</strong></td><td style="text-align:left;">直接由计算机执行的二进制代码</td><td style="text-align:left;">执行速度快</td><td style="text-align:left;">编写困难,可读性差,与具体硬件强绑定</td><td style="text-align:left;">二进制代码</td></tr><tr><td style="text-align:left;"><strong>汇编语言</strong></td><td style="text-align:left;">用助记符代替二进制代码的低级语言</td><td style="text-align:left;">相对机器语言更易编写和理解,允许直接控制硬件资源</td><td style="text-align:left;">依然需要了解硬件,不够抽象,与具体硬件或平台相关</td><td style="text-align:left;">MOV,ADD 等助记符</td></tr><tr><td style="text-align:left;"><strong>高级语言</strong></td><td style="text-align:left;">接近人类语言,提供了更高层次的抽象</td><td style="text-align:left;">易于编写和维护,可移植性好,支持多种编程范式</td><td style="text-align:left;">需要通过编译器或解释器转换为机器语言,可能存在一定的性能损失</td><td style="text-align:left;">C,Java, Python 等</td></tr></tbody></table><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① 这三种编程语言类型从低级到高级提供了不同层次的抽象,以满足不同的编程需求和场景。</li><li>② 随着计算机科学的发展,高级语言因其强大的表达能力、良好的可移植性和易用性,成为了日常软件开发的主流选择。</li></ul></div><h1 id="第三章-初识-c-语言" tabindex="-1">第三章:初识 C 语言 <a class="header-anchor" href="#第三章-初识-c-语言" aria-label="Permalink to "第三章:初识 C 语言""></a></h1><h2 id="_3-1-c-语言的由来" tabindex="-1">3.1 C 语言的由来 <a class="header-anchor" href="#_3-1-c-语言的由来" aria-label="Permalink to "3.1 C 语言的由来""></a></h2><ul><li>1969 年,美国贝尔实验室的<code>肯·汤姆森</code>(Ken Thompson)和<code>丹尼斯·里奇</code>(Dennis Ritchie)一起开发了 Unix 操作系统。Unix 最初是使用<code>汇编语言</code>编写的,依赖于计算机硬件。为了程序的<code>可读性</code>和<code>可移植性</code>,它们决定使用高级语言重写。但是。当时的高级语言无法满足他们的要求,<code>肯·汤姆森</code>就在 BCPL 语言的基础上发明了 <code>B</code> 语言。</li><li>1972 年,<code>丹尼斯·里奇</code>(Dennis Ritchie)在 <code>B</code> 语言的基础上重新设计了一种新的语言,这种新语言取代了 <code>B</code> 语言,即 <code>C</code> 语言。</li></ul><p><img src="'+v+'" alt=""></p><ul><li>1973 年,<code>整个 Unix 系统都使用 C 语言重写</code>。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>C 语言最初是作为 Unix 系统的开发工具而发明的。</p></div><ul><li>此后,这种语言快速流传,广泛用于各种操作系统和系统软件的开发,如:Unix、MS-DOS、Microsoft Windows 以及 Linux 等。</li></ul><p><img src="'+B+'" alt=""></p><ul><li>1988 年,美国国家标准协会(ANSI)正式将 <code>C 语言标准化</code>,标志着 C 语言开始稳定和规范化。</li></ul><h2 id="_3-2-为什么要学习-c-语言" tabindex="-1">3.2 为什么要学习 C 语言? <a class="header-anchor" href="#_3-2-为什么要学习-c-语言" aria-label="Permalink to "3.2 为什么要学习 C 语言?""></a></h2><ul><li>① <code>C 语言具有可移植好、跨平台的特点</code>:用 C 语言编写的代码可以在不同的操作系统和硬件平台上编译和运行。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>C 语言的最原始的设计目的,就是为了将 Unix 操作系统移植到其他的计算机架构上,这使得它从一开始就非常注重可移植性。</p></div><ul><li>② <code>C 语言在许多领域应用广泛</code>。 <ul><li><code>操作系统</code>:C 广泛用于开发操作系统,如:Unix、Linux 和 Windows。</li><li><code>嵌入式系统</code>:C 是一种用于开发嵌入式系统(如:微控制器、微处理器和其它电子设备)的流程语言。</li><li><code>系统软件</code>:C 用于开发设备驱动程序、编译器和汇编器等系统软件。</li><li><code>网络</code>:C 语言广泛用于开发网络应用程序,例如:Web 服务器、网络协议和网络驱动程序。</li><li><code>数据库系统</code>:C 用于开发数据库系统,例如:Oracle、MySQL 和 PostgreSQL 。</li><li><code>游戏</code>:由于 C 能够处理低级硬件交互,因此经常用于开发计算机游戏。</li><li><code>人工智能</code>:C 用于开发人工智能和机器学习的应用程序,例如:神经网络和深度学习算法。</li><li><code>科学应用</code>:C 用于开发科学应用程序,例如:仿真软件和数值分析工具。</li><li><code>金融应用</code>:C 用于开发股票市场分析和交易系统等金融应用。</li></ul></li><li>③ C 语言能够直接对硬件进行操作、管理内存以及和操作系统对话,这使得它是一种非常接近底层的语言,非常适合<code>写需要和硬件交互、有极高性能要求</code>的程序。</li><li>④ <code>学习 C 语言有助于快速上手其他编程语言</code>,如:C++(原先是 C 语言的一个扩展,在 C 语言的基础上嫁接了面向对象编程思想)、C#、Java 等,这些语言都继承或深受 C 语言的影响和启发。</li><li>⑤ C 语言长盛不衰。<code>C 语言至今,依然是最广泛使用、最流行的编程语言之一</code>,包括很多大学将 C 语言作为计算机教学的入门语言,拥有庞大而活跃的用户社区,这意味着有许多资源和库可供开发人员使用。</li></ul><h2 id="_3-3-计算机语言排行榜" tabindex="-1">3.3 计算机语言排行榜 <a class="header-anchor" href="#_3-3-计算机语言排行榜" aria-label="Permalink to "3.3 计算机语言排行榜""></a></h2><ul><li><a href="https://www.tiobe.com/tiobe-index/" target="_blank" rel="noreferrer">TIOBE</a> 是一个流行编程语言排行,每月更新。排名权重基于世界范围内工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。</li></ul><p><img src="'+f+'" alt=""></p><ul><li>计算机语言走势图:</li></ul><p><img src="'+A+'" alt=""></p><h2 id="_3-4-c-语言的版本选择" tabindex="-1">3.4 C 语言的版本选择 <a class="header-anchor" href="#_3-4-c-语言的版本选择" aria-label="Permalink to "3.4 C 语言的版本选择""></a></h2><ul><li><p>随着微型计算机的日益普及,出现了许多 C 语言版本(标准)。</p><ul><li>版本 1(K&R C):K&R C 指的是 C 语言的原始版本。1978年,C 语言的发明者布莱恩·柯林(Brian <code>K</code>ernighan)和丹尼斯·里奇(Dennis <code>R</code>itchie)合写了一本著名的教材《C 编程语言》(The C programming language)。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>由于 C 语言还没有成文的语法标准,这本书就成了公认标准,以两位作者的姓氏首字母作为版本简称 “K&R C”。</p></div><ul><li><p>版本 2(ANSI C,又称 C89 或 C90):C 语言的原始版本非常简单,对很多情况的描述非常模糊,加上 C 语法依然在快速发展,要求将 C 语言标准化的呼声越来越高。1989 年,美国国家标准协会(ANSI)制定了一套 C 语言标准,并于次年被国际标准化组织(ISO)通过。它被称为 “ANSI C”,也可以按照发布年份,称为 “C89 或 C90”。</p></li><li><p>版本 3(C99):C 语言标准的第一次<code>大型修订</code>,发生在 1999 年,增加了许多语言特性,比如:双斜杠( // )的注释语法,可变长度数组、灵活的数组成员、复数、内联函数和指定的初始值设定项,这个版本称为 C99,<code>是目前最流行的 C 版本</code>。</p></li><li><p>版本 4(C11):2011 年,标准化组织再一次对 C 语言进行修订,增加了_Generic、static_assert 和原子类型限定符。这个版本称为 C11。</p></li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>需要强调的是,修订标准的原因并不是因为原标准不能用,而是需要跟进新的技术。</p></div><ul><li>版本 5(C17):C11 标准在 2017 年进行了修补,但发布是在 2018 年。新版本只是解决了 C11 的一些缺陷,没有引入任何新功能。这个版本称为 C17。</li><li>版本 6(C23):2023 年发布,计划进一步增强安全性,消除实现定义的行为,引入模块化语言概念等新特性,使 C 语言在安全和可靠性方面有重大提高。</li><li>……</li></ul></li><li><p>需要注意的是,C 语言的标准并没有强制性的约束,只是个说明文档而已。不同的编译器产商,对 C 语言的标准有不同的实现,甚至会出现某些 C 语言的标准在这个编译器下实现了;但是,在另外的编辑器下却没有实现,导致编译程序错误的现象。常见的 C/C++ 编译器如下:</p><ul><li>Borland C++ 宝蓝公司。</li><li>Intel C++ 英特尔编译器。</li><li>MSVC 微软公司。</li><li>g++ 编译器(GCC,编译套件), Linux 操作系统。</li></ul></li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>GCC 编译套件对标准的支持是最好的;所以,在实际项目开发中,我们首先会选用 GCC 编译套件来进行开发。</p></div><h2 id="_3-5-c-语言的优缺点" tabindex="-1">3.5 C 语言的优缺点 <a class="header-anchor" href="#_3-5-c-语言的优缺点" aria-label="Permalink to "3.5 C 语言的优缺点""></a></h2><ul><li><p>C 语言的优点:</p><ul><li>① 高效:C 语言生成的代码非常高效,执行速度快,这使得其非常适合用于操作系统、嵌入式系统等需要高性能的场景。</li><li>② 灵活性和低级控制:C 语言允许直接操作内存和硬件,可以进行位操作、指针运算等底层编程,非常适合开发需要直接硬件控制的应用。</li><li>③ 广泛的硬件和平台支持:C 语言几乎可以在所有的计算机平台上运行,从微处理器到超级计算机,几乎所有的硬件平台都支持 C 语言。</li><li>④ 标准库丰富:C 语言有一个标准库(C Standard Library),提供了大量常用的函数,涵盖了文件操作、字符串处理、内存管理等多种功能。</li><li>⑤ 语言简洁:语法规则相对简单,没有过多的复杂特性,使得语言本身比较容易学习和掌握。</li></ul></li><li><p>C 语言的缺点:</p><ul><li>① 缺乏高级特性:和现代编程语言相对,C 语言缺乏一些高级特性,如:面向对象编程、垃圾回收机制等,这使得某些类型的应用程序开发可能会更加复杂。</li><li>② 安全性问题:C 语言允许直接操作内存,可能会导致缓冲区溢出、空指针引用等安全漏洞。如果不小心处理,容易产生难以调试的错误和安全隐患。</li><li>③ 手动管理内存:C 语言需要程序员手动管理内存,即:分配内存和释放内存,这增加了内存泄露和悬空指针等问题的风险。</li><li>④ 错误调试困难:由于 C 语言的底层操作特点,调试和排查错误可能比较困难,尤其是在处理复杂指针和内存操作的时候。</li><li>⑤ 标准库有限:虽然 C 语言的标准库涵盖了很多基本功能,但相比现代编程语言的标准库,功能相对有限,尤其是在网络编程、多线程编程等方面。</li></ul></li><li><p>总而言之,C 语言的高效性和灵活性使其在系统级编程和嵌入式系统中占据重要地位,但其缺乏高级特性和内存管理上的挑战也使得开发过程可能更加复杂和容易出错。对于需要高性能和底层控制的应用,C 语言依然是不可替代的选择。</p></li></ul><h2 id="_3-6-c-语言的学习技巧" tabindex="-1">3.6 C 语言的学习技巧 <a class="header-anchor" href="#_3-6-c-语言的学习技巧" aria-label="Permalink to "3.6 C 语言的学习技巧""></a></h2><ul><li>对于大部分的初学者, 学习 C 语言的目的可能是为了成为一名合格的程序员,开发出优秀的软件。但是,在学习了 C 语言的基本语法后,却发现只能在<code>控制台</code>(<code>黑底白字</code>)上玩玩,没有漂亮的用户界面以及人性化的交互。于是,开始学习数据结构、算法、数据库、操作系统,越陷越深,越来越迷茫,不知道学习 C 语言能做什么,认为学习编程很难,开始怀疑自己,直到放弃!!!</li><li>其实,C 语言本身就是一门非常简单的语言,提供的实用功能不多,大部分的时候需要<code>借助</code>操作系统、第三方库以及以及一些硬件才能发挥它的威力!!!</li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><ul><li>① 学习 C 语言仅仅是让你踏上程序员之路的第一步而已,只学习 C 语言也做不了什么。</li><li>② 系统、扎实的学习 C 语言可以让你了解底层硬件、一些简单的数据结构和算法,并培养计算机思维。</li></ul></div><ul><li>C 语言是一门通用性的语言,并没有针对某个领域进行优化,在实际项目中,C 语言主要用于比较底层的开发,例如: <ul><li>Windows、Linux、Unix 等操作系统的内核 90% 以上都使用 C 语言开发(Rust 语言有望未来,在更多的操作系统开发中占据一席之地,特别是在对安全性和性能要求极高的领域)。</li><li>开发硬件驱动,让硬件和操作系统连接起来,这样用户才能更有效的使用硬件。</li><li>单片机和嵌入式属于软硬件的结合,是使用 C 语言最多的地方。</li><li>开发系统组件或服务,用于支撑上层应用。</li><li>……</li></ul></li><li>既然 C 语言的应用很多,为什么感觉学习它还是做不了什么?答案就是<code>生态</code>。</li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>现代化的高级编程语言的流行程度,除了和编程语言的设计是否优秀有关,最主要的原因就是<code>生态</code>。</p><ul><li>① 很多编程语言都自带<code>标准库</code>(语言本身提供的,开箱即用),如:Java、Go 等。</li><li>② 很多编程语言都有自己的<code>包管理器</code>(用于管理第三方库)解决方案,如:Java 中的 Maven、Gradle、Go 中的 go modules ,JavaScript 的 npm 等。</li></ul><p>遗憾的是,C 语言的<code>标准库</code>非常简单,只有<code>输入输出</code>、<code>文件操作</code>、<code>日期时间</code>、<code>字符串处理</code>、<code>内存管理</code>,对于<code>网络编程</code>、<code>GUI</code>、<code>数据库</code>、<code>并发</code>等<code>需要</code>大量的<code>第三方库</code>来扩展 C 语言的功能(Java 语言、Go 语言等其他的现代化高级编程语言,都是直接将这些常见的开发场景内置到标准库中,极大的降低了软件开发的难度)。C 语言的<code>第三方库</code>也非常稀少,更别提缺少自己的包管理器。</p><p>不过,现在 C 语言社区也开始诞生了一些包管理器,如:Conan 和 vcpkg ;也有自己的项目构建工具,如:cmake 、xmake 等。</p></div><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>JavaScript 的作者 Brendan Eich(布兰登·艾奇) 曾经这么说:“与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:"它的优秀之处并非原创,它的原创之处并不优秀。"”</p><p>汇编生 C ,C 生万物!!!</p></div><h2 id="_3-7-项目构建工具和包管理器" tabindex="-1">3.7 项目构建工具和包管理器 <a class="header-anchor" href="#_3-7-项目构建工具和包管理器" aria-label="Permalink to "3.7 项目构建工具和包管理器""></a></h2><h3 id="_3-7-1-概述" tabindex="-1">3.7.1 概述 <a class="header-anchor" href="#_3-7-1-概述" aria-label="Permalink to "3.7.1 概述""></a></h3><ul><li><code>项目构建工具</code>和<code>包管理器</code>在软件开发中扮演着不同的角色,它们虽然有时会有重叠的功能,但主要关注的点是不同的。</li></ul><h3 id="_3-7-2-项目构建工具" tabindex="-1">3.7.2 项目构建工具 <a class="header-anchor" href="#_3-7-2-项目构建工具" aria-label="Permalink to "3.7.2 项目构建工具""></a></h3><ul><li><code>项目构建工具</code>是用于<code>自动化编译、测试、打包、部署</code>等一系列任务的软件工具。它们帮助开发者简化和管理整个软件开发生命周期中的各个步骤,尤其是在构建过程中的复杂性管理上。</li><li>其功能有: <ul><li><strong>编译代码</strong>:自动编译源代码(如 :<code>.java</code>、<code>.c</code> 等)为可执行文件或中间文件(如:<code>.class</code> 文件)。</li><li><strong>运行测试</strong>:集成单元测试、集成测试,自动运行测试用例并生成报告。</li><li><strong>打包</strong>:将编译后的代码、依赖库、资源文件等打包成可分发的格式(如:JAR、WAR、可执行文件等)。</li><li><strong>依赖管理</strong>:自动下载、更新和管理项目所需的第三方库(这部分功能有时与包管理器重叠)。</li><li><strong>部署</strong>:将打包后的应用程序自动部署到测试环境、生产环境等。</li><li><strong>任务自动化</strong>:除了基本的构建流程外,还可以自动化执行一些常见任务,如:代码检查、文档生成等。</li></ul></li><li>常用的项目构建工具: <ul><li><strong>Maven(Java)</strong>:一个流行的构建工具和依赖管理工具,广泛用于 Java 项目。</li><li><strong>Gradle(Java、Kotlin、Groovy)</strong>:一个灵活的构建工具,支持声明式的构建脚本和多种语言。</li><li><strong>Make(C/C++)</strong>:一个经典的构建工具,使用 <code>Makefile</code> 来定义构建规则和依赖关系。</li><li><s><strong>Ant(Java)</strong>:早期流行的 Java 构建工具,通过 XML 配置文件定义构建过程。</s></li><li><strong>CMake(C/C++)</strong>:一个跨平台的构建系统,帮助生成标准的构建文件,如:Makefile 或 Visual Studio 项目文件。</li></ul></li></ul><h3 id="_3-7-3-包管理器" tabindex="-1">3.7.3 包管理器 <a class="header-anchor" href="#_3-7-3-包管理器" aria-label="Permalink to "3.7.3 包管理器""></a></h3><ul><li><code>包管理器</code>是用于<code>自动化安装、更新、配置</code>和<code>管理软件包及其依赖关系</code>的工具。它主要关注于获取和管理项目所需的第三方库或工具包,并确保它们正确地集成到项目中。</li><li>其功能有: <ul><li><strong>依赖管理</strong>:根据项目配置文件(如:<code>package.json</code>、<code>requirements.txt</code>)自动下载和安装项目所需的依赖包。</li><li><strong>版本控制</strong>:管理包的版本,允许开发者指定某个特定版本或版本范围,确保项目中的库版本一致性。</li><li><strong>包的发布和共享</strong>:开发者可以通过包管理器发布自己的库,并且共享给社区或组织内部的其他项目使用。</li><li><strong>环境隔离</strong>:有些包管理器提供虚拟环境功能,可以将不同项目的依赖隔离开,避免版本冲突。</li><li><strong>更新和卸载</strong>:包管理器可以自动更新依赖包到最新的兼容版本或卸载不再需要的包。</li></ul></li><li>常见的包管理器: <ul><li><strong>npm(Node.js)</strong>:用于管理 JavaScript 和 Node.js 项目的包和模块。</li><li><strong>pip(Python)</strong>:用于安装和管理 Python 的软件包。</li><li><strong>Composer(PHP)</strong>:用于管理 PHP 项目的依赖库。</li><li><strong>NuGet(.NET)</strong>:用于管理 .NET 平台上的包和库。</li><li><strong>RubyGems(Ruby)</strong>:用于管理 Ruby 的库和工具包。</li><li><strong>Cargo(Rust)</strong>:Rust 编程语言的包管理器和构建工具。</li><li><strong>Yarn(JavaScript)</strong>:是 npm 的替代品,提供更快和更可靠的包管理体验。</li><li><strong>Homebrew(macOS)</strong>:用于 macOS 系统下的命令行工具和库的管理。</li></ul></li></ul><h3 id="_3-7-3-注意事项" tabindex="-1">3.7.3 注意事项 <a class="header-anchor" href="#_3-7-3-注意事项" aria-label="Permalink to "3.7.3 注意事项""></a></h3><ul><li>对于 <code>Java</code> 项目中的 <code>Maven</code> 或 <code>Gradle</code> 而言,其不仅是<code>项目构建工具</code>也是<code>包管理工具</code>。</li></ul><h1 id="第四章-c-语言入门-hello-world-⭐" tabindex="-1">第四章:C 语言入门(Hello World,⭐) <a class="header-anchor" href="#第四章-c-语言入门-hello-world-⭐" aria-label="Permalink to "第四章:C 语言入门(Hello World,⭐)""></a></h1><h2 id="_4-1-环境的安装和配置" tabindex="-1">4.1 环境的安装和配置 <a class="header-anchor" href="#_4-1-环境的安装和配置" aria-label="Permalink to "4.1 环境的安装和配置""></a></h2><h3 id="_4-1-1-概述" tabindex="-1">4.1.1 概述 <a class="header-anchor" href="#_4-1-1-概述" aria-label="Permalink to "4.1.1 概述""></a></h3><ul><li><p>要开发 C/C++ 程序,需要安装 C/C++ 编译器,目前有两种主流实现,即:</p><ul><li>GCC(GNU Compiler Collection):全平台实现,即支持 Windows、MacOS、Linux 等。</li><li>MSVC(Microsoft Visual C++):只支持 Windows 系统。</li></ul></li><li><p>GCC 在 Windows 上的版本有很多,如:<a href="https://www.mingw-w64.org/" target="_blank" rel="noreferrer">MinGW-w64</a>、<a href="https://cygwin.com/" target="_blank" rel="noreferrer">Gygwin</a>、<a href="https://www.msys2.org/" target="_blank" rel="noreferrer">MSYS2</a>。它们之间的区别,如下所示:</p></li></ul><table tabindex="0"><thead><tr><th>特性</th><th>MinGW-w64</th><th>Cygwin</th><th>MSYS2</th></tr></thead><tbody><tr><td><strong>简介</strong></td><td>Minimalist GNU for Windows</td><td>POSIX 兼容环境和工具集</td><td>结合了 MinGW 和 Cygwin 的工具集</td></tr><tr><td><strong>编译器</strong></td><td>提供 GCC 编译器</td><td>提供 POSIX 兼容环境,包含大量工具</td><td>提供 MinGW-w64 工具链和 Cygwin 环境</td></tr><tr><td><strong>生成文件</strong></td><td>Windows 原生可执行文件</td><td>POSIX 兼容的可执行文件</td><td>可以生成 Windows 原生可执行文件或 POSIX 文件</td></tr><tr><td><strong>依赖</strong></td><td>无需额外依赖</td><td>依赖 Cygwin DLL</td><td>根据使用工具链决定(MinGW-w64 无依赖,Cygwin 有依赖)</td></tr><tr><td><strong>工具和库</strong></td><td>基本的编译工具</td><td>丰富的 Unix 工具和库</td><td>丰富的工具和库,强大的包管理系统</td></tr><tr><td><strong>性能</strong></td><td>性能较好</td><td>可能较低,因为通过兼容层调用系统</td><td>取决于使用的工具链(MinGW-w64 性能较好)</td></tr><tr><td><strong>复杂度</strong></td><td>简单易用</td><td>设置和使用相对复杂</td><td>较为灵活,复杂度介于 MinGW-w64 和 Cygwin 之间</td></tr><tr><td><strong>适用场景</strong></td><td>开发 Windows 原生应用</td><td>运行和开发 Unix 程序</td><td>混合使用 Unix 工具和开发 Windows 原生应用</td></tr><tr><td><strong>优点</strong></td><td>轻量级,直接生成 Windows 应用</td><td>完整的 POSIX 兼容环境,丰富的工具</td><td>灵活的环境,强大的包管理系统</td></tr><tr><td><strong>缺点</strong></td><td>工具和库较少</td><td>生成文件依赖 Cygwin DLL,性能可能较低</td><td>环境较大,占用更多空间,复杂性比 MinGW-w64 高</td></tr></tbody></table><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① MinGW-w64 、Cygwin 以及 MSYS2 任选其一安装即可。</li><li>② 目前的 Win10 和 Win11 版本支持 WSL2 (Windows Sub Linux 2 ,即 Windows 的子系统 Linux),可以实现在 Windows 系统上安装一个 Linux ,然后再运行 Linux 中的 GCC 工具链。</li></ul></div><h3 id="_4-1-2-mingw-w64-的安装和配置" tabindex="-1">4.1.2 MinGW-w64 的安装和配置 <a class="header-anchor" href="#_4-1-2-mingw-w64-的安装和配置" aria-label="Permalink to "4.1.2 MinGW-w64 的安装和配置""></a></h3><h4 id="_4-1-2-1-安装" tabindex="-1">4.1.2.1 安装 <a class="header-anchor" href="#_4-1-2-1-安装" aria-label="Permalink to "4.1.2.1 安装""></a></h4><ul><li>下载到本地:略。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>下载地址在<a href="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" target="_blank" rel="noreferrer">这里</a>。</p></div><p><img src="'+x+'" alt=""></p><ul><li>解压到指定的目录,即:</li></ul><p><img src="'+D+'" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>本人的解压目录是:<code>D:\\develop\\mingw64</code> 。</p></div><h4 id="_4-1-2-2-配置-path-环境变量" tabindex="-1">4.1.2.2 配置 path 环境变量 <a class="header-anchor" href="#_4-1-2-2-配置-path-环境变量" aria-label="Permalink to "4.1.2.2 配置 path 环境变量""></a></h4><ul><li>配置环境变量,以便任意目录都可以执行 gcc 命令,即:</li></ul><p><img src="'+q+'" alt=""></p><p><img src="'+S+'" alt=""></p><p><img src="'+w+'" alt=""></p><p><img src="'+L+'" alt=""></p><p><img src="'+P+'" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>因为,本人安装 MinGW-w64 的目录是 <code>D:\\develop\\mingw64</code>,所以配置 path 环境变量就需要 <code>D:\\develop\\mingw64\\bin</code>。</p></div><p><img src="'+T+'" alt=""></p><ul><li>测试是否安装成功:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --version</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+U+'" alt=""></p><h3 id="_4-1-3-cygwin-的安装和配置" tabindex="-1">4.1.3 Cygwin 的安装和配置 <a class="header-anchor" href="#_4-1-3-cygwin-的安装和配置" aria-label="Permalink to "4.1.3 Cygwin 的安装和配置""></a></h3><h4 id="_4-1-3-1-安装" tabindex="-1">4.1.3.1 安装 <a class="header-anchor" href="#_4-1-3-1-安装" aria-label="Permalink to "4.1.3.1 安装""></a></h4><ul><li>下载到本地:略。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>下载地址在<a href="https://www.cygwin.com/install.html" target="_blank" rel="noreferrer">这里</a>。</p></div><p><img src="'+I+'" alt=""></p><ul><li>点击安装:</li></ul><p><img src="'+R+'" alt=""></p><p><img src="'+N+'" alt=""></p><p><img src="'+W+'" alt=""></p><p><img src="'+M+'" alt=""></p><p><img src="'+O+'" alt=""></p><p><img src="'+G+'" alt=""></p><p><img src="'+X+'" alt=""></p><p><img src="'+V+'" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>默认是最小化安装,没有 GCC,需要选择 gcc-core、gcc-g++、make、gdb、binutils 。</p></div><p><img src="'+H+'" alt=""></p><p><img src="'+$+'" alt=""></p><p><img src="'+K+'" alt=""></p><p><img src="'+J+'" alt=""></p><p><img src="'+j+'" alt=""></p><p><img src="'+Q+'" alt=""></p><p><img src="'+Y+'" alt=""></p><p><img src="'+z+'" alt=""></p><p><img src="'+Z+'" alt=""></p><h4 id="_4-1-3-2-配置-path-环境变量" tabindex="-1">4.1.3.2 配置 path 环境变量 <a class="header-anchor" href="#_4-1-3-2-配置-path-环境变量" aria-label="Permalink to "4.1.3.2 配置 path 环境变量""></a></h4><ul><li>和 <code>3.1.2.2 配置 path 环境变量</code> 步骤相同:略。</li></ul><h3 id="_4-1-4-msys2-推荐" tabindex="-1">4.1.4 MSYS2(推荐) <a class="header-anchor" href="#_4-1-4-msys2-推荐" aria-label="Permalink to "4.1.4 MSYS2(推荐)""></a></h3><h4 id="_4-1-4-1-安装" tabindex="-1">4.1.4.1 安装 <a class="header-anchor" href="#_4-1-4-1-安装" aria-label="Permalink to "4.1.4.1 安装""></a></h4><ul><li>下载到本地:略。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>下载地址在<a href="https://www.msys2.org/" target="_blank" rel="noreferrer">这里</a>。</p></div><p><img src="'+ss+'" alt=""></p><ul><li>点击安装:</li></ul><p><img src="'+as+'" alt=""></p><p><img src="'+is+'" alt=""></p><p><img src="'+ns+'" alt=""></p><p><img src="'+ls+'" alt=""></p><p><img src="'+es+'" alt=""></p><ul><li>出现命令终端:</li></ul><p><img src="'+ts+'" alt=""></p><ul><li>替换清华镜像源(可选):</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sed</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "s#https\\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /etc/pacman.d/mirrorlist</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">*</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ps+'" alt=""></p><ul><li>安装 gcc 等相关开发包:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pacman</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -Syu</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --noconfirm</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 更新包管理器</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pacman</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -Sy</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> base-devel</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --noconfirm</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装开发工具包</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pacman</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -Sy</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> mingw-w64-x86_64-toolchain</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --noconfirm</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装开发 gcc 相关工具链</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+rs+'" alt=""></p><h4 id="_4-1-4-2-配置-path-环境变量" tabindex="-1">4.1.4.2 配置 path 环境变量 <a class="header-anchor" href="#_4-1-4-2-配置-path-环境变量" aria-label="Permalink to "4.1.4.2 配置 path 环境变量""></a></h4><ul><li>和 <code>3.1.2.2 配置 path 环境变量</code> 步骤相同:略。</li></ul><h2 id="_4-2-ide-的安装和配置" tabindex="-1">4.2 IDE 的安装和配置 <a class="header-anchor" href="#_4-2-ide-的安装和配置" aria-label="Permalink to "4.2 IDE 的安装和配置""></a></h2><h3 id="_4-2-1-clion" tabindex="-1">4.2.1 CLion <a class="header-anchor" href="#_4-2-1-clion" aria-label="Permalink to "4.2.1 CLion""></a></h3><h4 id="_4-2-1-1-概述" tabindex="-1">4.2.1.1 概述 <a class="header-anchor" href="#_4-2-1-1-概述" aria-label="Permalink to "4.2.1.1 概述""></a></h4><ul><li><a href="https://www.jetbrains.com/clion/" target="_blank" rel="noreferrer">CLion</a> 是一款由 JetBrains 推出的跨平台 C/C++ 集成开发环境(IDE),它具有智能编辑器、CMake 构建支持、调试器、单元测试、代码分析等功能,可以极大提高 C/C++ 开发效率。</li></ul><h4 id="_4-2-1-2-安装" tabindex="-1">4.2.1.2 安装 <a class="header-anchor" href="#_4-2-1-2-安装" aria-label="Permalink to "4.2.1.2 安装""></a></h4><ul><li>鼠标双击,进入安装:</li></ul><p><img src="'+cs+'" alt=""></p><ul><li>下一步:</li></ul><p><img src="'+hs+'" alt=""></p><ul><li>下一步:</li></ul><p><img src="'+ds+'" alt=""></p><ul><li>下一步:</li></ul><p><img src="'+os+'" alt=""></p><ul><li>安装:</li></ul><p><img src="'+ks+'" alt=""></p><ul><li>安装完成:</li></ul><p><img src="'+us+'" alt=""></p><h4 id="_4-2-1-3-配置" tabindex="-1">4.2.1.3 配置 <a class="header-anchor" href="#_4-2-1-3-配置" aria-label="Permalink to "4.2.1.3 配置""></a></h4><ul><li>打开 CLion :</li></ul><p><img src="'+gs+'" alt=""></p><ul><li>安装中文插件(可选):</li></ul><p><img src="'+bs+'" alt=""></p><p><img src="'+ms+'" alt=""></p><ul><li>配置新 UI :</li></ul><p><img src="'+Es+'" alt=""></p><p><img src="'+Cs+'" alt=""></p><ul><li>新 UI 配置自定义字体(可选):</li></ul><p><img src="'+ys+'" alt=""></p><ul><li>配置<code>自动保存</code>功能:</li></ul><p><img src="'+Fs+'" alt=""></p><ul><li>配置<code>文件编码</code> 为 UTF-8:</li></ul><p><img src="'+_s+'" alt=""></p><ul><li>配置<code>控制台编码</code>为 UTF-8:</li></ul><p><img src="'+vs+'" alt=""></p><ul><li>配置<code>显示方法分隔符</code>功能:</li></ul><p><img src="'+Bs+'" alt=""></p><ul><li>配置<code>编辑器</code>的字体(可选):</li></ul><p><img src="'+fs+'" alt=""></p><ul><li>检测 GCC 工具链是否安装成功:</li></ul><p><img src="'+As+'" alt=""></p><h3 id="_4-2-2-vs-code" tabindex="-1">4.2.2 VS Code <a class="header-anchor" href="#_4-2-2-vs-code" aria-label="Permalink to "4.2.2 VS Code""></a></h3><h4 id="_4-2-2-1-概述" tabindex="-1">4.2.2.1 概述 <a class="header-anchor" href="#_4-2-2-1-概述" aria-label="Permalink to "4.2.2.1 概述""></a></h4><ul><li><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer">Visual Studio Code (VS Code)</a> 是一个免费的开源代码编辑器,适用于 Windows、MacOS 和 Linux 平台。它支持语法高亮、智能代码补全(IntelliSense)、内置调试工具和Git集成。用户可以通过扩展来添加更多功能,如:支持新的编程语言、主题和调试工具。VS Code 还支持在微软 Azure 上进行部署和托管,适用于各种编程语言和框架。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>Visual Studio Code 需要安装对应的插件,才能运行 C/C++ 代码。</p></div><h4 id="_4-2-2-2-安装" tabindex="-1">4.2.2.2 安装 <a class="header-anchor" href="#_4-2-2-2-安装" aria-label="Permalink to "4.2.2.2 安装""></a></h4><ul><li>鼠标双击,进入安装:</li></ul><p><img src="'+xs+'" alt=""></p><ul><li>同意协议:</li></ul><p><img src="'+Ds+'" alt=""></p><ul><li>下一步:</li></ul><p><img src="'+qs+'" alt=""></p><ul><li>下一步:</li></ul><p><img src="'+Ss+'" alt=""></p><ul><li>下一步:</li></ul><p><img src="'+ws+'" alt=""></p><ul><li>安装:</li></ul><p><img src="'+Ls+'" alt=""></p><ul><li>安装过程:</li></ul><p><img src="'+Ps+'" alt=""></p><ul><li>安装完成:</li></ul><p><img src="'+Ts+'" alt=""></p><h4 id="_4-2-2-3-配置" tabindex="-1">4.2.2.3 配置 <a class="header-anchor" href="#_4-2-2-3-配置" aria-label="Permalink to "4.2.2.3 配置""></a></h4><ul><li>安装<code>中文</code>插件:</li></ul><p><img src="'+Us+'" alt=""></p><p><img src="'+Is+'" alt=""></p><ul><li>安装 <code>C/C++</code> 插件:</li></ul><p><img src="'+Rs+'" alt=""></p><p><img src="'+Ns+'" alt=""></p><h3 id="_4-2-3-microsoft-visual-studio" tabindex="-1">4.2.3 Microsoft Visual Studio <a class="header-anchor" href="#_4-2-3-microsoft-visual-studio" aria-label="Permalink to "4.2.3 Microsoft Visual Studio""></a></h3><h4 id="_4-2-3-1-概述" tabindex="-1">4.2.3.1 概述 <a class="header-anchor" href="#_4-2-3-1-概述" aria-label="Permalink to "4.2.3.1 概述""></a></h4><ul><li><p><a href="https://visualstudio.microsoft.com/" target="_blank" rel="noreferrer">Visual Studio</a>(简称 VS)是由微软公司发布的集成开发环境。它包括了整个软件生命周期中所需要的大部分工具,如:UML工具、代码管控工具、集成开发环境(IDE)等。</p></li><li><p>Visual Studio 支持 C/C++、C#、F#、VB 等多种程序语言的开发和测试,可以用于生成Web应用程序,也可以生成桌面应用程序,功能十分强大,但下载和安装很可能耗时数小时,还可能会塞满磁盘。</p></li><li><p>Visual Studio 2022 有三种版本:社区版(免费,不支持企业使用),专业版(第一年 1199 美元/ 799 美元续订)和企业版(第一年 5999 美元/ 2569 美元续订)。企业版拥有面向架构师的功能、高级调试和测试,这些功能是另两种 SKU 所没有的。</p></li><li><p>Visual Studio 旨在成为世界上最好的 IDE(集成开发环境),目前最新版本为 Visual Studio 2022。</p></li></ul><h4 id="_4-2-3-2-安装" tabindex="-1">4.2.3.2 安装 <a class="header-anchor" href="#_4-2-3-2-安装" aria-label="Permalink to "4.2.3.2 安装""></a></h4><ul><li>鼠标双击,进入安装:</li></ul><p><img src="'+Ws+'" alt=""></p><ul><li>继续:</li></ul><p><img src="'+Ms+'" alt=""></p><ul><li>等待:</li></ul><p><img src="'+Os+'" alt=""></p><ul><li>工作负荷(使用 C++ 的桌面开发):</li></ul><p><img src="'+Gs+'" alt=""></p><ul><li>单个组件:</li></ul><p><img src="'+Xs+'" alt=""></p><ul><li>语言包:</li></ul><p><img src="'+Vs+'" alt=""></p><ul><li>安装位置(修改默认的安装位置):</li></ul><p><img src="'+Hs+'" alt=""></p><ul><li>如果不是第一次安装,可能会出现<code>共享组件、工具和 SDK</code>不可以修改,即:</li></ul><p><img src="'+$s+'" alt=""></p><ul><li>此时,就需要打开<code>注册表编辑器</code>,将如下图中的除了第一个选项,全部删除,然后关闭再重新安装,即:</li></ul><p><img src="'+Ks+'" alt=""></p><ul><li>开始安装:</li></ul><p><img src="'+Js+'" alt=""></p><ul><li>安装中:</li></ul><p><img src="'+js+'" alt=""></p><ul><li>安装完成,然后关闭:</li></ul><p><img src="'+Qs+'" alt=""></p><h4 id="_4-2-3-3-配置" tabindex="-1">4.2.3.3 配置 <a class="header-anchor" href="#_4-2-3-3-配置" aria-label="Permalink to "4.2.3.3 配置""></a></h4><ul><li>在开始菜单处,启动 VS :</li></ul><p><img src="'+Ys+'" alt=""></p><ul><li>登录或跳过该选项(有微软账号就注册,没有就暂时跳过):</li></ul><p><img src="'+zs+'" alt=""></p><ul><li>继续:</li></ul><p><img src="'+Zs+'" alt=""></p><ul><li>注册 VS :</li></ul><p><img src="'+sa+'" alt=""></p><ul><li>填写注册码:</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① Pro 版本:<code>TD244-P4NB7-YQ6XK-Y8MMM-YWV2J</code></li><li>② Enterprise 版本:<code>VHF9H-NXBBB-638P6-6JHCY-88JWH</code></li></ul></div><p><img src="'+aa+'" alt=""></p><p><img src="'+ia+'" alt=""></p><h2 id="_4-3-helloworld" tabindex="-1">4.3 HelloWorld <a class="header-anchor" href="#_4-3-helloworld" aria-label="Permalink to "4.3 HelloWorld""></a></h2><h3 id="_4-3-1-手动版" tabindex="-1">4.3.1 手动版 <a class="header-anchor" href="#_4-3-1-手动版" aria-label="Permalink to "4.3.1 手动版""></a></h3><ul><li>① 新建一个 <code>HelloWorld.c</code> 的文件:</li></ul><p><img src="'+na+`" alt=""></p><ul><li>② 通过<code>记事本</code>等软件打开该文件,输入如下的代码,并保存:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(){</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello World"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p><img src="`+la+'" alt=""></p><ul><li>③ 通过 <code>gcc</code> 命令编译该文件:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.c</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.exe</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ea+'" alt=""></p><ul><li>④ 执行:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">./HelloWorld.exe</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ta+'" alt=""></p><h3 id="_4-3-2-vs-code-版" tabindex="-1">4.3.2 VS Code 版 <a class="header-anchor" href="#_4-3-2-vs-code-版" aria-label="Permalink to "4.3.2 VS Code 版""></a></h3><ul><li>① 新建一个<code>空</code>文件夹(目录),用于存放代码:</li></ul><p><img src="'+pa+'" alt=""></p><ul><li>② 通过 <code>vscode</code> 打开该目录:</li></ul><p><img src="'+ra+'" alt=""></p><ul><li>③ 在 <code>vscode</code> 中新建 <code>HelloWorld.c</code> 文件:</li></ul><p><img src="'+ca+'" alt=""></p><ul><li>④ 设置 VSCode 中 C/C++ 的代码格式为行尾风格(可选):</li></ul><p><img src="'+ha+'" alt=""></p><p><img src="'+da+`" alt=""></p><ul><li>⑤ 编写如下的代码,并保存:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(){</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello World"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p><img src="`+oa+'" alt=""></p><ul><li>⑥ 通过 <code>gcc</code> 命令编译该文件:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.c</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.exe</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ka+'" alt=""></p><ul><li>⑦ 执行:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">./HelloWorld.exe</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ua+'" alt=""></p><ul><li>⑧ 安装 Code Runner 插件(步骤略),实现右键直接编译执行(可选):</li></ul><p><img src="'+ga+'" alt=""></p><h3 id="_4-3-3-vs-版" tabindex="-1">4.3.3 VS 版 <a class="header-anchor" href="#_4-3-3-vs-版" aria-label="Permalink to "4.3.3 VS 版""></a></h3><ul><li>① 新建空项目:</li></ul><p><img src="'+ba+'" alt=""></p><p><img src="'+ma+'" alt=""></p><p><img src="'+Ea+'" alt=""></p><p><img src="'+Ca+'" alt=""></p><ul><li>② 打开<code>解决方案资源管理器</code>:</li></ul><p><img src="'+ya+'" alt=""></p><p><img src="'+Fa+'" alt=""></p><ul><li>③ 新建 <code>HelloWorld.c</code> 文件:</li></ul><p><img src="'+_a+`" alt=""></p><ul><li>④ 编写如下代码,并保存:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(){</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello World"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p><img src="`+va+'" alt=""></p><ul><li>⑤ 编译和执行:</li></ul><p><img src="'+Ba+'" alt=""></p><h3 id="_4-3-4-clion" tabindex="-1">4.3.4 CLion <a class="header-anchor" href="#_4-3-4-clion" aria-label="Permalink to "4.3.4 CLion""></a></h3><ul><li>① 新建空项目:</li></ul><p><img src="'+fa+'" alt=""></p><p><img src="'+Aa+'" alt=""></p><p><img src="'+xa+`" alt=""></p><ul><li>② 编写如下代码,并保存:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(){</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello World"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p><img src="`+Da+'" alt=""></p><ul><li>③ 编译和运行:</li></ul><p><img src="'+qa+'" alt=""></p><ul><li>④ 默认情况下,一个项目只能有一个 c 源文件包含 main 函数,但是 CLion 可以有多个,如下:</li></ul><p><img src="'+Sa+'" alt=""></p><ul><li>⑤ 如果之后,有中文乱码问题,那么请做如下步骤:</li></ul><p><img src="'+wa+'" alt=""></p><p><img src="'+La+`" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>内容如下所示:</p><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>-Dfile.encoding=UTF-8</span></span>
|
||
<span class="line"><span>-Dconsole.encoding=UTF-8</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></div><h1 id="第五章-注释" tabindex="-1">第五章:注释 <a class="header-anchor" href="#第五章-注释" aria-label="Permalink to "第五章:注释""></a></h1><h2 id="_5-1-概述" tabindex="-1">5.1 概述 <a class="header-anchor" href="#_5-1-概述" aria-label="Permalink to "5.1 概述""></a></h2><ul><li>编程语言中,<code>注释</code>是一种<code>特殊</code>的文本,它不会被编译器执行,而仅用于代码的解释和文档说明。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① 注释是一个程序员必须有具有的良好编程习惯。</li><li>② 在实际开发中,程序员可以将自己的思路通过<code>注释</code>整理出来,然后再用<code>代码</code>去实现。</li></ul></div><h2 id="_5-2-单行注释" tabindex="-1">5.2 单行注释 <a class="header-anchor" href="#_5-2-单行注释" aria-label="Permalink to "5.2 单行注释""></a></h2><ul><li>C 语言中的单行注释的格式,如下所示:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 单行注释</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>在 CLion 中的快捷键是 <code>Ctrl + /</code> 。</p></div><ul><li>示例:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 这是编译预处理指令</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 定义主函数</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"你好,世界!!!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 输出所指定的一行信息</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 函数执行完毕时返回函数值0</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h2 id="_5-3-多行注释" tabindex="-1">5.3 多行注释 <a class="header-anchor" href="#_5-3-多行注释" aria-label="Permalink to "5.3 多行注释""></a></h2><ul><li>C 语言中的多行注释的格式,如下所示:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/*</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> 这是第一行注释</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> 这是第二行注释</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> 这是第三行注释</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">*/</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① 多行注释不能嵌套使用!!!</li><li>② 在 CLion 中的快捷键是 <code>Ctrl + Alt + /</code> 。</li></ul></div><ul><li>示例:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() { </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /*</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> printf(1);</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> printf(2);</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"你好,世界!!!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">); </span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h1 id="第六章-helloworld-的规范-⭐" tabindex="-1">第六章:HelloWorld 的规范(⭐) <a class="header-anchor" href="#第六章-helloworld-的规范-⭐" aria-label="Permalink to "第六章:HelloWorld 的规范(⭐)""></a></h1><h2 id="_6-1-规范的代码风格" tabindex="-1">6.1 规范的代码风格 <a class="header-anchor" href="#_6-1-规范的代码风格" aria-label="Permalink to "6.1 规范的代码风格""></a></h2><h3 id="_6-1-1-正确的缩进和空白" tabindex="-1">6.1.1 正确的缩进和空白 <a class="header-anchor" href="#_6-1-1-正确的缩进和空白" aria-label="Permalink to "6.1.1 正确的缩进和空白""></a></h3><ul><li>① 使用一次 <code>tab</code> 操作,实现缩进,默认整体向右边移动;如果使用 <code>shift + tab</code> 则整体向左移动。</li><li>② 运算符两边习惯各加一个空格,如:<code>2 + 4 = 6</code>。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>各种 IDE 都有格式化的快捷键,如:CLion 的格式化快捷键是 <code>Ctrl + Alt + L</code> 。</p></div><ul><li>示例:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"c = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, c);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h3 id="_6-1-2-代码风格" tabindex="-1">6.1.2 代码风格 <a class="header-anchor" href="#_6-1-2-代码风格" aria-label="Permalink to "6.1.2 代码风格""></a></h3><ul><li>在 C 语言中,有两种代码风格:<code>行尾风格</code>和<code>次行风格</code>。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>看个人爱好,任选一种即可,本人喜欢<code>行尾分格</code>!!!</p></div><ul><li>示例:行尾风格</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(){ </span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><ul><li>示例:次行风格</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{ </span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b) </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h2 id="_6-2-代码细节剖析" tabindex="-1">6.2 代码细节剖析 <a class="header-anchor" href="#_6-2-代码细节剖析" aria-label="Permalink to "6.2 代码细节剖析""></a></h2><h3 id="_6-2-1-main-函数" tabindex="-1">6.2.1 main() 函数 <a class="header-anchor" href="#_6-2-1-main-函数" aria-label="Permalink to "6.2.1 main() 函数""></a></h3><ul><li>在 C 语言中,一个程序或工程可以定义很多函数,但是有且只有一个 main() 函数,作为程序执行的入口,并且在 main() 函数结尾结束整个程序的运行,即:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(){</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ul><li>如果 main() 函数是空括号,即表示 main() 函数不接收任何参数。</li><li>在 main() 函数之前的 <code>int</code> 称为关键字,代表数据类型是<code>整型</code>,它是 main() 函数的返回值的类型,即在执行 main() 函数之后一定会得到一个整数类型的值,即函数值。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① 在 C 语言中,人们约定,如果 <code>return 0</code>,就表示 main() 函数终止运行,且运行成功;如果返回其它非零整数,则表示运行失败。</li><li>② 默认情况下,如果 main() 函数中省略 <code>return 0</code> ,则编译器会自动加上;但是,为了保持统一的代码风格,不建议省略。</li></ul></div><h3 id="_6-2-2-函数体" tabindex="-1">6.2.2 函数体 <a class="header-anchor" href="#_6-2-2-函数体" aria-label="Permalink to "6.2.2 函数体""></a></h3><ul><li>① 一对花括号 <code>{}</code> 定义了函数的主体,所有函数都必须以大括号开头和结尾,成对出现。</li><li>② C 程序中的函数体指的是作为该函数一部分的语句。它可以是任何操作,比如:搜索、排序、打印等。</li><li>③ 每一个执行语句后面都会有一个英文分号<code>;</code>作为语句结束的标志。</li><li>④ 一行内可写几条语句,一条语句也可写在几行上。</li></ul><h3 id="_6-2-3-printf-函数" tabindex="-1">6.2.3 printf() 函数 <a class="header-anchor" href="#_6-2-3-printf-函数" aria-label="Permalink to "6.2.3 printf() 函数""></a></h3><ul><li>printf() 函数的格式,如下所示:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> char</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">__format</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, ...)</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><ul><li>printf() 函数是产生格式化输出的函数,作用是将参数文本输出到屏幕,f 表示 format(格式化),表示可以指定输出文本的格式,即:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello World"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 将字符串输出到控制台,行尾不换行</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><ul><li>如果想让光标移动到下一行的开头,可以在输出文本的结尾,可以添加一个换行符 <code>\\n</code>,即:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello World</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h3 id="_6-2-4-标准库和头文件" tabindex="-1">6.2.4 标准库和头文件 <a class="header-anchor" href="#_6-2-4-标准库和头文件" aria-label="Permalink to "6.2.4 标准库和头文件""></a></h3><h4 id="_6-2-4-1-概述" tabindex="-1">6.2.4.1 概述 <a class="header-anchor" href="#_6-2-4-1-概述" aria-label="Permalink to "6.2.4.1 概述""></a></h4><ul><li>printf() 函数是在标准库的头文件 <code>stdio.h</code> 中定义的,要想在程序中使用这个函数,必须在源文件的头部引入该头文件,即:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h4 id="_6-2-4-2-标准库-standard-library" tabindex="-1">6.2.4.2 标准库(Standard Library) <a class="header-anchor" href="#_6-2-4-2-标准库-standard-library" aria-label="Permalink to "6.2.4.2 标准库(Standard Library)""></a></h4><ul><li>C 语言的<code>标准库</code>是由一组函数组成,这些函数提供了许多常用的操作和功能,如:输入输出、字符串处理、内存管理、数学计算等。标准库中的函数由编译器提供,遵循 ANSI C 标准(如:C89/C90、C99、C11等)。</li><li>换言之,C 语言的<code>标准库</code>就是包含函数的实际代码,这些代码在编译的时候被链接到我们的程序中,无需手动包含。C 语言的<code>标准库</code>提供了可重用的函数实现,使得程序员不必编写常用的功能。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>实际的 printf() 函数的实现代码通常位于标准库的实现文件中,如:在 Linux 中的标准库<code>libc.so.6</code> 就包含了 printf() 函数的实现。</p></div><h4 id="_6-2-4-3-头文件-header-files" tabindex="-1">6.2.4.3 头文件(Header Files) <a class="header-anchor" href="#_6-2-4-3-头文件-header-files" aria-label="Permalink to "6.2.4.3 头文件(Header Files)""></a></h4><ul><li><p><code>头文件</code>是包含函数声明、宏定义、数据类型定义等内容的文件。头文件的作用是为源代码提供必要的声明和定义,以便编译器能够正确解析和链接函数调用。头文件通常以<code>.h</code>作为文件扩展名。</p></li><li><p>换言之,头文件包含函数声明、宏定义和数据类型定义,但不包含函数的实现。头文件告知编译器如何使用标准库中的函数和定义,确保编译时的正确性。头文件需要在源代码文件中使用<code>#include</code>指令显式包含,如:<code>#include <stdio.h></code>。</p></li><li><p>常见的 C 语言头文件及其功能和常用函数、宏等,如下所示:</p></li></ul><table tabindex="0"><thead><tr><th>头文件</th><th>功能说明</th><th>常用函数和宏</th></tr></thead><tbody><tr><td><strong>stdio.h</strong></td><td>标准输入输出库</td><td><code>printf</code>, <code>scanf</code>, <code>fprintf</code>,<code>fscanf</code>,<code>fopen</code>, <code>fclose</code>,<code>fgets</code>, <code>fputs</code></td></tr><tr><td><strong>stdlib.h</strong></td><td>标准库,提供内存分配、程序控制、类型转换、随机数生成等功能</td><td><code>malloc</code>, <code>free</code>, <code>exit</code>, <code>atoi</code>, <code>atof</code>,<code>rand</code>,<code>srand</code></td></tr><tr><td><strong>string.h</strong></td><td>字符串处理库</td><td><code>strlen</code>, <code>strcpy</code>, <code>strncpy</code>, <code>strcat</code>, <code>strcmp</code>,<code>strstr</code>, <code>memset</code>, <code>memcpy</code></td></tr><tr><td><strong>math.h</strong></td><td>数学库</td><td><code>sin</code>, <code>cos</code>, <code>tan</code>, <code>exp</code>, <code>log</code>, <code>sqrt</code>, <code>pow</code></td></tr><tr><td><strong>time.h</strong></td><td>时间和日期库</td><td><code>time</code>, <code>clock</code>, <code>difftime</code>, <code>mktime</code>, <code>strftime</code>, <code>localtime</code>,<code>gmtime</code></td></tr><tr><td><strong>ctype.h</strong></td><td>字符处理库</td><td><code>isalnum</code>, <code>isalpha</code>, <code>isdigit</code>, <code>islower</code>, <code>isupper</code>, <code>tolower</code>, <code>toupper</code></td></tr><tr><td><strong>stdbool.h</strong></td><td>布尔类型库</td><td><code>bool</code>, <code>true</code>, <code>false</code></td></tr><tr><td><strong>assert.h</strong></td><td>断言库</td><td><code>assert</code></td></tr></tbody></table><h4 id="_6-2-4-4-预处理命令" tabindex="-1">6.2.4.4 预处理命令 <a class="header-anchor" href="#_6-2-4-4-预处理命令" aria-label="Permalink to "6.2.4.4 预处理命令""></a></h4><ul><li><code>#include</code> 命令的作用是将指定文件的内容插入到包含该命令的源文件中。这通常用于包含头文件,以便使用头文件中声明的函数、宏和数据类型。</li><li>语法:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用于包含标准库头文件或系统头文件。</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 编译器将在系统的标准头文件目录中查找文件。</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <filename></span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 用于包含用户自定义的头文件。</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 编译器首先在当前目录中查找文件,如果未找到,再在标准头文件目录中查找。</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "filename"</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h1 id="第七章-clion-高级配置-⭐" tabindex="-1">第七章:CLion 高级配置(⭐) <a class="header-anchor" href="#第七章-clion-高级配置-⭐" aria-label="Permalink to "第七章:CLion 高级配置(⭐)""></a></h1><h2 id="_7-1-安装和配置-wsl2" tabindex="-1">7.1 安装和配置 WSL2 <a class="header-anchor" href="#_7-1-安装和配置-wsl2" aria-label="Permalink to "7.1 安装和配置 WSL2""></a></h2><h3 id="_7-1-1-概述" tabindex="-1">7.1.1 概述 <a class="header-anchor" href="#_7-1-1-概述" aria-label="Permalink to "7.1.1 概述""></a></h3><ul><li>WSL 2,全称为 Windows Subsystem for Linux 2,是微软提供的一种技术,允许用户在 Windows 操作系统上运行 Linux 内核。WSL 2 是 WSL 的升级版,它引入了一个真正的 Linux 内核来代替 WSL 1 中使用的兼容层,从而提供更高的性能和更广泛的系统调用支持。</li><li>其架构图,如下所示:</li></ul><p><img src="`+Pa+'" alt=""></p><ul><li><p>WSL2 的功能,如下所示:</p><ul><li>① <strong>真实的Linux内核</strong>:WSL 2 使用了微软开发的轻量级虚拟机,它包含了一个完整的 Linux 内核。这意味着 WSL 2 能够运行更多的 Linux 应用程序,并且支持更多的系统调用。</li><li>② <strong>文件系统性能提升</strong>:WSL 2 的文件系统性能比 WSL 1 有显著提升。对于 I/O 密集型的操作,如:编译代码或数据库操作,WSL 2 能够提供更快的速度。</li><li>③ <strong>兼容性增强</strong>:由于使用了真实的 Linux 内核,WSL 2 对 Linux 应用程序的兼容性大幅提高。许多在 WSL 1上不能运行或需要调整的应用程序,可以在 WSL 2上直接运行。</li><li>④ <strong>网络功能改进</strong>:WSL 2 提供了更好的网络集成,能够更容易地与 Windows 上的其他网络资源进行交互。</li><li>⑤ <strong>资源使用优化</strong>:WSL 2 使用轻量级虚拟机,比传统的虚拟机占用更少的资源,同时提供了类似的隔离和安全性。</li></ul></li><li><p>WSL 的用途,如下所示:</p><ul><li>① <strong>开发环境</strong>:WSL 2 为开发者提供了一个原生的Linux开发环境,而无需离开 Windows 。这对于需要在 Linux 上开发、测试或运行应用程序的开发者非常有帮助。</li><li>② <strong>学习和实验</strong>:用户可以使用 WSL 2 在Windows上学习和实验 Linux 命令行工具和应用程序,而无需设置双重引导系统或安装虚拟机。</li><li>③ <strong>多平台开发</strong>:对于跨平台开发者来说,WSL 2 允许他们在一个操作系统上同时进行 Windows 和 Linux 平台的开发和测试,提高工作效率。</li><li>④ <strong>运行 Linux 工具和应用程序</strong>:WSL 2 支持在 Windows 上直接运行各种 Linux 工具和应用程序,如:Docker、数据库、编程语言环境等。</li></ul></li></ul><h3 id="_7-1-2-wsl2-的安装" tabindex="-1">7.1.2 WSL2 的安装 <a class="header-anchor" href="#_7-1-2-wsl2-的安装" aria-label="Permalink to "7.1.2 WSL2 的安装""></a></h3><ul><li>① BIOS 或 UEFI 中,开启虚拟化:步骤略。</li></ul><p><img src="'+Ta+'" alt=""></p><ul><li>② 查看是否开启了虚拟化:</li></ul><p><img src="'+Ua+'" alt=""></p><ul><li>③ 启用适用于 Linux 的 Windows 子系统:</li></ul><div class="language-powershell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">dism.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">online </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">enable-feature</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">featurename:Microsoft</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Windows</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Subsystem</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Linux </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">all </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">norestart</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>以管理员身份打开 PowerShell 并运行,执行完上述命令之后,如果提示需要重启计算机,那就重启计算机。</p></div><p><img src="'+Ia+'" alt=""></p><ul><li>④ 启用虚拟机功能:</li></ul><div class="language-powershell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">dism.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">online </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">enable-feature</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">featurename:VirtualMachinePlatform </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">all </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">norestart</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>以管理员身份打开 PowerShell 并运行,执行完上述命令之后,如果提示需要重启计算机,那就重启计算机。</p></div><p><img src="'+Ra+'" alt=""></p><ul><li>⑤ 更新 Linux 内核包:</li></ul><div class="language-powershell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">wsl </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">update</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>wsl2 的最新 Linux 内核包托管在 GitHub 上,某些国家可能会污染 Github 相关的域名,那么就需要手动下载,然后安装即可,下载地址在<a href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" target="_blank" rel="noreferrer">这里</a>。</p></div><p><img src="'+Na+'" alt=""></p><ul><li>⑥ 将 wsl2 设置为默认版本:</li></ul><div class="language-powershell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">wsl </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">--</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">set-default</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">version </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+Wa+'" alt=""></p><ul><li>⑦ 查看官方在线支持的 Linux 版本:</li></ul><div class="language-powershell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">wsl </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">list </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">online</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+Ma+'" alt=""></p><ul><li>⑧ 安装指定版本的 Linux :</li></ul><div class="language-powershell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">wsl </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">install Ubuntu</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">24.04</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>官方支持的 Linux 版本,托管在 Github 上,某些国家可能会污染 Github 的域名;此时,要么走科学上网,要么在 <code>Microsoft Store</code> 中搜索并安装。</p></div><p><img src="'+Oa+'" alt=""></p><ul><li>⑨ 在 Microsoft Store 中搜索并安装(可选):</li></ul><p><img src="'+Ga+'" alt=""></p><ul><li>⑩ 查询本地安装的 Linux 版本:</li></ul><div class="language-powershell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">wsl </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">list</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+Xa+`" alt=""></p><h3 id="_7-1-3-配置-wsl2" tabindex="-1">7.1.3 配置 WSL2 <a class="header-anchor" href="#_7-1-3-配置-wsl2" aria-label="Permalink to "7.1.3 配置 WSL2""></a></h3><ul><li>本人的安装的是 AlmaLinux9 ,所以需要执行如下命令,以便安装 cmake 相关工具链:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dnf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> update</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 更新包管理器 </span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dnf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> groupinstall</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "Development Tools"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装开发工具包</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dnf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gcc-c++</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装GCC相关工具链</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dnf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cmake</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装 cmake</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dnf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> make</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装 make</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dnf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gdb</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装 gdb</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p><img src="`+Va+'" alt=""></p><ul><li>可以通过 CLion 测试是否安装成功:</li></ul><p><img src="'+Ha+`" alt=""></p><h3 id="_7-1-4-配置-wsl2" tabindex="-1">7.1.4 配置 WSL2 <a class="header-anchor" href="#_7-1-4-配置-wsl2" aria-label="Permalink to "7.1.4 配置 WSL2""></a></h3><ul><li>本人的安装的是 Ubuntu 24.04,所以需要执行如下命令,以便安装 cmake 相关工具链:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> update</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> upgrade</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 更新包管理器</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build-essential</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装开发工具包</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> g++</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装 GCC 相关工具链</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cmake</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装 cmake</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gdb</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 安装 gdb</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p><img src="`+$a+'" alt=""></p><ul><li>可以通过 CLion 测试是否安装成功:</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>默认仓库中的 GDB 的版本会很高,CLion 会不支持,那么就需要手动下载源码,自行编译,本次不再演示!!!</p></div><p><img src="'+Ka+'" alt=""></p><h2 id="_7-2-切换-clion-中的-cmake-的工具链" tabindex="-1">7.2 切换 CLion 中的 cmake 的工具链 <a class="header-anchor" href="#_7-2-切换-clion-中的-cmake-的工具链" aria-label="Permalink to "7.2 切换 CLion 中的 cmake 的工具链""></a></h2><ul><li>可以在 CLoin 中切换 cmake 的工具链,以便支持不同平台的 cmake ,即:</li></ul><p><img src="'+Ja+'" alt=""></p><h2 id="_7-3-修改-cmakelists-txt-文件" tabindex="-1">7.3 修改 CMakeLists.txt 文件 <a class="header-anchor" href="#_7-3-修改-cmakelists-txt-文件" aria-label="Permalink to "7.3 修改 CMakeLists.txt 文件""></a></h2><ul><li>前文也提到了,在一个 C 语言项目中,只能有一个 main() 函数;但是,我们可以修改 <code>CMakeLists.txt</code> 文件的内容,以便其支持在一个 C 语言项目中,可以有多个包含 main() 函数的文件,如下所示:</li></ul><p><img src="'+ja+`" alt=""></p><ul><li><code>CMakeLists.txt</code> 的内容,如下所示:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>cmake_minimum_required(VERSION 3.10)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 项目名称和版本号</span></span>
|
||
<span class="line"><span>project(c-study VERSION 1.0 LANGUAGES C)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 设置 C 标准</span></span>
|
||
<span class="line"><span>set(CMAKE_C_STANDARD 23)</span></span>
|
||
<span class="line"><span>set(CMAKE_C_STANDARD_REQUIRED True)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 辅助函数,用于递归查找所有源文件</span></span>
|
||
<span class="line"><span>function(collect_sources result dir)</span></span>
|
||
<span class="line"><span> file(GLOB_RECURSE new_sources "\${dir}/*.c")</span></span>
|
||
<span class="line"><span> set(\${result} \${\${result}} \${new_sources} PARENT_SCOPE)</span></span>
|
||
<span class="line"><span>endfunction()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 查找顶层 include 目录(如果存在)</span></span>
|
||
<span class="line"><span>if (EXISTS "\${CMAKE_SOURCE_DIR}/include")</span></span>
|
||
<span class="line"><span> include_directories(\${CMAKE_SOURCE_DIR}/include)</span></span>
|
||
<span class="line"><span>endif ()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 查找所有源文件</span></span>
|
||
<span class="line"><span>set(SOURCES)</span></span>
|
||
<span class="line"><span>collect_sources(SOURCES \${CMAKE_SOURCE_DIR})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 用于存储已经处理过的可执行文件名,防止重复</span></span>
|
||
<span class="line"><span>set(EXECUTABLE_NAMES)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 创建可执行文件</span></span>
|
||
<span class="line"><span>foreach (SOURCE \${SOURCES})</span></span>
|
||
<span class="line"><span> # 获取文件的相对路径</span></span>
|
||
<span class="line"><span> file(RELATIVE_PATH REL_PATH \${CMAKE_SOURCE_DIR} \${SOURCE})</span></span>
|
||
<span class="line"><span> # 将路径中的斜杠替换为下划线,生成唯一的可执行文件名</span></span>
|
||
<span class="line"><span> string(REPLACE "/" "_" EXECUTABLE_NAME \${REL_PATH})</span></span>
|
||
<span class="line"><span> string(REPLACE "\\\\" "_" EXECUTABLE_NAME \${EXECUTABLE_NAME})</span></span>
|
||
<span class="line"><span> string(REPLACE "." "_" EXECUTABLE_NAME \${EXECUTABLE_NAME})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 处理与 CMakeLists.txt 文件同名的问题</span></span>
|
||
<span class="line"><span> if (\${EXECUTABLE_NAME} STREQUAL "CMakeLists_txt")</span></span>
|
||
<span class="line"><span> set(EXECUTABLE_NAME "\${EXECUTABLE_NAME}_exec")</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 检查是否已经创建过同名的可执行文件</span></span>
|
||
<span class="line"><span> if (NOT EXECUTABLE_NAME IN_LIST EXECUTABLE_NAMES)</span></span>
|
||
<span class="line"><span> list(APPEND EXECUTABLE_NAMES \${EXECUTABLE_NAME})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 创建可执行文件</span></span>
|
||
<span class="line"><span> add_executable(\${EXECUTABLE_NAME} \${SOURCE})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 查找源文件所在的目录,并添加为包含目录(头文件可能在同一目录下)</span></span>
|
||
<span class="line"><span> get_filename_component(DIR \${SOURCE} DIRECTORY)</span></span>
|
||
<span class="line"><span> target_include_directories(\${EXECUTABLE_NAME} PRIVATE \${DIR})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 检查并添加子目录中的 include 目录(如果存在)</span></span>
|
||
<span class="line"><span> if (EXISTS "\${DIR}/include")</span></span>
|
||
<span class="line"><span> target_include_directories(\${EXECUTABLE_NAME} PRIVATE \${DIR}/include)</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 检查并添加 module 目录中的所有 C 文件(如果存在)</span></span>
|
||
<span class="line"><span> if (EXISTS "\${DIR}/module")</span></span>
|
||
<span class="line"><span> file(GLOB_RECURSE MODULE_SOURCES "\${DIR}/module/*.c")</span></span>
|
||
<span class="line"><span> target_sources(\${EXECUTABLE_NAME} PRIVATE \${MODULE_SOURCES})</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span>endforeach ()</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br></div></div><h2 id="_7-4-配置-clang-format-文件" tabindex="-1">7.4 配置 .clang-format 文件 <a class="header-anchor" href="#_7-4-配置-clang-format-文件" aria-label="Permalink to "7.4 配置 .clang-format 文件""></a></h2><ul><li>配置 <code>.clang-format</code> 格式化文件,以便写代码的时候,可以自动保存并格式化 C 程序代码,如下所示:</li></ul><p><img src="`+Qa+`" alt=""></p><ul><li><code>.clang-format</code> 的内容,如下所示:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>BasedOnStyle: Google</span></span>
|
||
<span class="line"><span>IndentWidth: 4</span></span>
|
||
<span class="line"><span>UseTab: Never</span></span>
|
||
<span class="line"><span>ColumnLimit: 0</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 控制大括号的位置</span></span>
|
||
<span class="line"><span>BreakBeforeBraces: Attach</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 控制空行的使用</span></span>
|
||
<span class="line"><span>EmptyLineBeforeAccessModifier: Never</span></span>
|
||
<span class="line"><span>KeepEmptyLinesAtTheStartOfBlocks: true</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 控制短函数、短 if 语句和循环的格式</span></span>
|
||
<span class="line"><span>AllowShortFunctionsOnASingleLine: Empty</span></span>
|
||
<span class="line"><span>AllowShortIfStatementsOnASingleLine: false</span></span>
|
||
<span class="line"><span>AllowShortLoopsOnASingleLine: false</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 控制其他格式选项</span></span>
|
||
<span class="line"><span>AlignConsecutiveAssignments: true</span></span>
|
||
<span class="line"><span>AlignConsecutiveDeclarations: true</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 控制注释的格式化</span></span>
|
||
<span class="line"><span>ReflowComments: true</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 控制包含指令的格式化</span></span>
|
||
<span class="line"><span>IncludeBlocks: Regroup</span></span>
|
||
<span class="line"><span>SortIncludes: CaseInsensitive</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>SpaceBeforeParens: ControlStatements</span></span>
|
||
<span class="line"><span>SpacesInParentheses: false</span></span>
|
||
<span class="line"><span>SpacesInAngles: false</span></span>
|
||
<span class="line"><span>SpacesInContainerLiterals: false</span></span>
|
||
<span class="line"><span>SpacesInCStyleCastParentheses: false</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br></div></div><ul><li>CLion 中配置<code>保存</code>的时候<code>自动格式化</code>,即:</li></ul><p><img src="`+Ya+'" alt=""></p><h2 id="_7-5-配置-gitignore-文件" tabindex="-1">7.5 配置 .gitignore 文件 <a class="header-anchor" href="#_7-5-配置-gitignore-文件" aria-label="Permalink to "7.5 配置 .gitignore 文件""></a></h2><ul><li>需要在项目中,配置 <code>.gitignore</code> 文件,以便在提交代码到 Git 仓库的时候,忽略某些文件或目录,如下所示:</li></ul><p><img src="'+za+`" alt=""></p><ul><li><code>.gitignore</code> 文件的内容,如下所示:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>.vscode</span></span>
|
||
<span class="line"><span>.idea</span></span>
|
||
<span class="line"><span>cmake-build-*</span></span>
|
||
<span class="line"><span>build</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><h2 id="_7-6-演示" tabindex="-1">7.6 演示 <a class="header-anchor" href="#_7-6-演示" aria-label="Permalink to "7.6 演示""></a></h2><ul><li>我们可以在项目中,临时创建或复制一个文件,看上述配置是否生效,即:</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>如果是复制并粘贴一个文件到项目中,请点击<code>重新加载 CMake 项目</code>!!!</p></div><p><img src="`+Za+'" alt=""></p><h1 id="第八章-c-语言的编译过程-⭐" tabindex="-1">第八章:C 语言的编译过程(⭐) <a class="header-anchor" href="#第八章-c-语言的编译过程-⭐" aria-label="Permalink to "第八章:C 语言的编译过程(⭐)""></a></h1><h2 id="_8-1-概述" tabindex="-1">8.1 概述 <a class="header-anchor" href="#_8-1-概述" aria-label="Permalink to "8.1 概述""></a></h2><ul><li>C 程序的编译过程,如下所示:</li></ul><p><img src="'+si+'" alt=""></p><ul><li>过程 ① :编写(编辑)源代码,即:编写 C 语言源程序代码,并以文件的形式存储在磁盘中。</li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>源程序需要以 <code>.c</code> 作为扩展名。</p></div><ul><li>过程 ② :编译,即:将 C 语言源程序转换为<code>目标程序(或目标文件)</code>。如果程序没有错误,没有任何提示,就会生成一个扩展名为 <code>.obj</code>或 <code>.o</code> 的二进制文件。C 语言中的每条可执行语句经过编译之后,最终都会转换为二进制的机器指令。</li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><ul><li><p>① 其实,<code>编译阶段</code>包含了<code>预处理</code>、<code>编译</code>和<code>汇编</code>。</p></li><li><p>② <code>预处理</code>是编译过程的第一个阶段。在这个阶段,预处理器处理源代码中的指令(例如:<code>#include</code>、<code>#define</code>等),主要任务包括:</p><ul><li><p><strong>头文件包含</strong>:将头文件的内容插入到源文件中。例如:<code>#include <stdio.h></code>会被替换为<code>stdio.h</code>文件的内容。</p></li><li><p><strong>宏展开</strong>:替换宏定义。例如:<code>#define PI 3.14</code>会将代码中的<code>PI</code>替换为<code>3.14</code>。</p></li><li><p><strong>条件编译</strong>:根据条件指令(如:<code>#ifdef</code>、<code>#ifndef</code>)有选择地编译代码。</p></li><li><p><strong>删除代码中的注释,但是不会进行语法检查</strong>。</p></li><li><p>预处理完成后,生成一个扩展名为<code>.i</code>的中间文件。</p></li></ul></li><li><p>③ <code>编译</code>是将预处理后的源代码转换为汇编代码的过程。在这个阶段,编译器会检查代码的语法和语义,将其转换为目标机器的汇编语言,生成一个扩展名为<code>.s</code>的汇编文件。</p></li><li><p>④ <code>汇编</code>是将汇编代码转换为机器代码(也称为目标代码或目标文件)的过程。在这个阶段,汇编器将汇编指令转换为二进制机器指令,生成一个扩展名为<code>.o</code>或 <code>.obj</code>的目标文件。</p></li></ul></div><ul><li>过程 ③ :链接(连接),即:将编译形成的目标文件 <code>*.obj</code> 或 <code>*.o</code>和库函数以及其他目录文件<code>链接</code>,形成一个统一的二进制文件 <code>*.exe</code>。</li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><ul><li>为什么需要链接库文件?</li><li>因为我们的 C 程序会使用 C 程序库中的内容,如:<code><stdio.h></code> 中的 <code>printf()</code> 函数,这些函数不是程序员自己写的,而是 C 程序库中提供的,因此需要链接。其实,在链接过程中,还会加入启动代码,这个启动代码(和系统相关,Linux 下主要有 crt0.c、crti.c 等,它们设置堆栈后,再调用 main() 函数)负责初始化程序运行时的环境。</li></ul></div><ul><li>过程 ④ :执行,即:有了可执行的 <code>*.exe</code>文件,我们就可以在控制台上执行运行此 <code>*.exe</code> 文件。</li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>如果<code>修改</code>了源代码,还需要重新<code>编译</code>、<code>链接</code>,并生成新的 <code>*.exe</code>文件,再执行,方能生效。</p></div><h2 id="_8-2-gcc-编译器的介绍" tabindex="-1">8.2 GCC 编译器的介绍 <a class="header-anchor" href="#_8-2-gcc-编译器的介绍" aria-label="Permalink to "8.2 GCC 编译器的介绍""></a></h2><ul><li>编辑器,如:vim 、vscode 等,是指我们用它来编写源程序的(编辑代码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。换言之,我们用编辑器编写程序,由编译器编译后才可以运行!</li><li>编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。</li><li>gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc 原本作为 GNU 操作系统的官方编译器,现已被大多数类 Unix 操作系统(如:Linux、BSD、Mac OS X 等)采纳为标准的编译器,gcc 同样适用于微软的 Windows 。</li><li>gcc 最初用于编译 C 语言,随着项目的发展, gcc 已经成为了能够编译 C、C++、Java、Ada、fortran、Object C、Object C++、Go 语言的编译器大家族。</li></ul><h2 id="_8-3-通过-gcc-直接生成可执行文件" tabindex="-1">8.3 通过 gcc 直接生成可执行文件 <a class="header-anchor" href="#_8-3-通过-gcc-直接生成可执行文件" aria-label="Permalink to "8.3 通过 gcc 直接生成可执行文件""></a></h2><ul><li>示例:进行预处理、编译、汇编和链接</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.c</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.exe</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ai+'" alt=""></p><h2 id="_8-4-通过-gcc-分步编译" tabindex="-1">8.4 通过 gcc 分步编译 <a class="header-anchor" href="#_8-4-通过-gcc-分步编译" aria-label="Permalink to "8.4 通过 gcc 分步编译""></a></h2><h3 id="_8-3-1-概述" tabindex="-1">8.3.1 概述 <a class="header-anchor" href="#_8-3-1-概述" aria-label="Permalink to "8.3.1 概述""></a></h3><ul><li>预处理命令:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -E</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.c</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.i</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 通常以 .i 结尾表示这个文件是一个中间状态</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><ul><li>编译(预处理和编译)命令:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -S</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.i</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.s</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 在 Linux 中,通常以 .s 结尾;在 Windows 中,通常以 .asm 结尾</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><ul><li>汇编(预处理、编译和汇编)命令:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.o</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 在 Linux 中,通常以 .o 结尾;在 Windows 中,通常以 .obj 结尾</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><ul><li>链接(预处理、编译、汇编和链接)命令:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.o</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 源文件.exe</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 在 Linux 中,通常以 .out 结尾;在 Windows 中,通常以 .exe 结尾</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h3 id="_8-4-2-应用示例" tabindex="-1">8.4.2 应用示例 <a class="header-anchor" href="#_8-4-2-应用示例" aria-label="Permalink to "8.4.2 应用示例""></a></h3><ul><li>示例:只进行预处理</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -E</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.c</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.i</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ii+'" alt=""></p><ul><li>示例:只进行预处理和编译</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -S</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.i</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.s</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ni+'" alt=""></p><ul><li>示例:只进行预处理、编译和汇编</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.o</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+li+'" alt=""></p><ul><li>示例:进行预处理、编译、汇编和链接</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.o</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> HelloWorld.exe</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ei+'" alt=""></p><h1 id="第九章-附录" tabindex="-1">第九章:附录 <a class="header-anchor" href="#第九章-附录" aria-label="Permalink to "第九章:附录""></a></h1><h2 id="_9-1-wsl2-代理问题" tabindex="-1">9.1 WSL2 代理问题 <a class="header-anchor" href="#_9-1-wsl2-代理问题" aria-label="Permalink to "9.1 WSL2 代理问题""></a></h2><ul><li>在安装和配置 WSL2 之后,可能会出现如下的提示,即:</li></ul><p><img src="'+ti+`" alt=""></p><ul><li>那么,只需要修改 <code>%USERPROFILE%\\.wslconfig</code>文件,内容如下:</li></ul><div class="language-txt vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>[wsl2]</span></span>
|
||
<span class="line"><span>networkingMode=mirrored</span></span>
|
||
<span class="line"><span>dnsTunneling=true</span></span>
|
||
<span class="line"><span>firewall=true</span></span>
|
||
<span class="line"><span>autoProxy=true</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>[experimental]</span></span>
|
||
<span class="line"><span># requires dnsTunneling but are also OPTIONAL</span></span>
|
||
<span class="line"><span>bestEffortDnsParsing=true</span></span>
|
||
<span class="line"><span>useWindowsDnsCache=true</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><p><img src="`+pi+'" alt=""></p><ul><li>在命令行中,执行如下的命令:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --shutdown</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ri+'" alt=""></p><ul><li>此时,再打开终端,就没有这种提示了:</li></ul><p><img src="'+ci+'" alt=""></p><h2 id="_9-2-clion-调试问题" tabindex="-1">9.2 CLion 调试问题 <a class="header-anchor" href="#_9-2-clion-调试问题" aria-label="Permalink to "9.2 CLion 调试问题""></a></h2><ul><li>在 CLion 中进行 run(运行)程序的时候,对于 <code>printf</code> 函数或 <code>scanf</code> 函数很正常,如下所示:</li></ul><p><img src="'+hi+'" alt=""></p><ul><li>但是,当我们 debug(调试) 的时候,对于 <code>printf</code> 函数或 <code>scanf</code> 函数会一直没有输出,如下所示:</li></ul><p><img src="'+di+`" alt=""></p><ul><li>原因是 <code>scanf</code> 函数并不是直接让用户从键盘输入数据,而是先检查缓冲区,处理缓冲区中的数据;当遇到 <code>scanf</code> 函数时,程序会先检查输入缓冲区中是否有数据,所以解决方案就是<code>禁用缓冲区</code>,如下所示:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 禁用 stdout 缓冲区</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> setbuf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(stdout, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a, b, c;</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"请输入整数 a 、b 和 c 的值:"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> scanf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> %d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> %d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">a, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">b, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">c);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> × </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> × </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, a, b, c, result);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><ul><li>那么,就会达到我们想要的效果了,如下所示:</li></ul><p><img src="`+oi+'" alt=""></p><h2 id="_9-3-内存泄露检测" tabindex="-1">9.3 内存泄露检测 <a class="header-anchor" href="#_9-3-内存泄露检测" aria-label="Permalink to "9.3 内存泄露检测""></a></h2><h3 id="_9-3-1-概述" tabindex="-1">9.3.1 概述 <a class="header-anchor" href="#_9-3-1-概述" aria-label="Permalink to "9.3.1 概述""></a></h3><ul><li>C 语言中的指针是否使用是个颇具争议的话题,现代化的高级编程语言通过各种策略和机制,在编译期就能解决指针危险的问题。但是,遗憾的是,C 语言的指针很大程度上,在运行期才会暴露问题。</li><li>幸运的是,我们可以使用 <code>Valgrind</code> 项目来进行<code>内存泄露检测</code>和<code>性能分析</code>,而 <code>Valgrind</code> 只支持 Linux 。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>win 11 中的 WSL2 就是个 Linux 环境,我们可以在上面跑各种 Linux 工具,这样我们就不需要再安装虚拟机软件了,如:VMware Workstation(它会完整的模拟一个硬件系统,并在上面跑各种 Linux ,实在是太笨重了)。</p></div><h3 id="_9-3-2-安装" tabindex="-1">9.3.2 安装 <a class="header-anchor" href="#_9-3-2-安装" aria-label="Permalink to "9.3.2 安装""></a></h3><ul><li>在 WSL2 上安装 Valgrind :</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">dnf</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> upgrade</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">dnf</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> valgrind</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # AlmaLinux</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">apt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> update</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">apt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> upgrade</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">apt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> valgrind</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Ubuntu</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ki+'" alt=""></p><ul><li>查看 valgrind 可执行文件的安装位置:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">which</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> valgrind</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+ui+'" alt=""></p><h3 id="_9-3-3-整合" tabindex="-1">9.3.3 整合 <a class="header-anchor" href="#_9-3-3-整合" aria-label="Permalink to "9.3.3 整合""></a></h3><ul><li>CLion 中将工具链设置为 WSL2 :</li></ul><p><img src="'+gi+'" alt=""></p><ul><li>CLion 中配置 valgrind 的路径:</li></ul><p><img src="'+bi+'" alt=""></p><ul><li>查看 WSL2 中 cmake 的版本:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">cmake</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --version</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+mi+`" alt=""></p><ul><li>修改项目中 CMakeLists.txt 中 cmake 的版本:</li></ul><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line highlighted"><span>cmake_minimum_required(VERSION 3.26.5) # 3.26.5</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 项目名称和版本号</span></span>
|
||
<span class="line"><span>project(c-study VERSION 1.0 LANGUAGES C)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 设置 C 标准</span></span>
|
||
<span class="line"><span>set(CMAKE_C_STANDARD 23)</span></span>
|
||
<span class="line"><span>set(CMAKE_C_STANDARD_REQUIRED True)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 辅助函数,用于递归查找所有源文件</span></span>
|
||
<span class="line"><span>function(collect_sources result dir)</span></span>
|
||
<span class="line"><span> file(GLOB_RECURSE new_sources "\${dir}/*.c")</span></span>
|
||
<span class="line"><span> set(\${result} \${\${result}} \${new_sources} PARENT_SCOPE)</span></span>
|
||
<span class="line"><span>endfunction()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 查找顶层 include 目录(如果存在)</span></span>
|
||
<span class="line"><span>if (EXISTS "\${CMAKE_SOURCE_DIR}/include")</span></span>
|
||
<span class="line"><span> include_directories(\${CMAKE_SOURCE_DIR}/include)</span></span>
|
||
<span class="line"><span>endif ()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 查找所有源文件</span></span>
|
||
<span class="line"><span>set(SOURCES)</span></span>
|
||
<span class="line"><span>collect_sources(SOURCES \${CMAKE_SOURCE_DIR})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 用于存储已经处理过的可执行文件名,防止重复</span></span>
|
||
<span class="line"><span>set(EXECUTABLE_NAMES)</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span># 创建可执行文件</span></span>
|
||
<span class="line"><span>foreach (SOURCE \${SOURCES})</span></span>
|
||
<span class="line"><span> # 获取文件的相对路径</span></span>
|
||
<span class="line"><span> file(RELATIVE_PATH REL_PATH \${CMAKE_SOURCE_DIR} \${SOURCE})</span></span>
|
||
<span class="line"><span> # 将路径中的斜杠替换为下划线,生成唯一的可执行文件名</span></span>
|
||
<span class="line"><span> string(REPLACE "/" "_" EXECUTABLE_NAME \${REL_PATH})</span></span>
|
||
<span class="line"><span> string(REPLACE "\\\\" "_" EXECUTABLE_NAME \${EXECUTABLE_NAME})</span></span>
|
||
<span class="line"><span> string(REPLACE "." "_" EXECUTABLE_NAME \${EXECUTABLE_NAME})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 处理与 CMakeLists.txt 文件同名的问题</span></span>
|
||
<span class="line"><span> if (\${EXECUTABLE_NAME} STREQUAL "CMakeLists_txt")</span></span>
|
||
<span class="line"><span> set(EXECUTABLE_NAME "\${EXECUTABLE_NAME}_exec")</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 检查是否已经创建过同名的可执行文件</span></span>
|
||
<span class="line"><span> if (NOT EXECUTABLE_NAME IN_LIST EXECUTABLE_NAMES)</span></span>
|
||
<span class="line"><span> list(APPEND EXECUTABLE_NAMES \${EXECUTABLE_NAME})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 创建可执行文件</span></span>
|
||
<span class="line"><span> add_executable(\${EXECUTABLE_NAME} \${SOURCE})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 查找源文件所在的目录,并添加为包含目录(头文件可能在同一目录下)</span></span>
|
||
<span class="line"><span> get_filename_component(DIR \${SOURCE} DIRECTORY)</span></span>
|
||
<span class="line"><span> target_include_directories(\${EXECUTABLE_NAME} PRIVATE \${DIR})</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 检查并添加子目录中的 include 目录(如果存在)</span></span>
|
||
<span class="line"><span> if (EXISTS "\${DIR}/include")</span></span>
|
||
<span class="line"><span> target_include_directories(\${EXECUTABLE_NAME} PRIVATE \${DIR}/include)</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span> # 检查并添加 module 目录中的所有 C 文件(如果存在)</span></span>
|
||
<span class="line"><span> if (EXISTS "\${DIR}/module")</span></span>
|
||
<span class="line"><span> file(GLOB_RECURSE MODULE_SOURCES "\${DIR}/module/*.c")</span></span>
|
||
<span class="line"><span> target_sources(\${EXECUTABLE_NAME} PRIVATE \${MODULE_SOURCES})</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span> endif ()</span></span>
|
||
<span class="line"><span>endforeach ()</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br></div></div><ul><li>在 CLion 中正常运行代码:</li></ul><p><img src="`+Ei+'" alt=""></p><ul><li>在 CLion 中通过 valgrind 运行代码:</li></ul><p><img src="'+Ci+'" alt=""></p><h2 id="_9-4-性能分析" tabindex="-1">9.4 性能分析 <a class="header-anchor" href="#_9-4-性能分析" aria-label="Permalink to "9.4 性能分析""></a></h2><h3 id="_9-4-1-概述" tabindex="-1">9.4.1 概述 <a class="header-anchor" href="#_9-4-1-概述" aria-label="Permalink to "9.4.1 概述""></a></h3><ul><li><code>perf</code> 是一个 Linux 下的性能分析工具,主要用于监控和分析系统性能。它可以帮助开发者和系统管理员了解系统中哪些部分在消耗资源、识别性能瓶颈以及分析程序的运行效率。</li></ul><h3 id="_9-4-2-安装" tabindex="-1">9.4.2 安装 <a class="header-anchor" href="#_9-4-2-安装" aria-label="Permalink to "9.4.2 安装""></a></h3><h4 id="_9-4-2-1-almalinux9" tabindex="-1">9.4.2.1 AlmaLinux9 <a class="header-anchor" href="#_9-4-2-1-almalinux9" aria-label="Permalink to "9.4.2.1 AlmaLinux9""></a></h4><ul><li>在 WSL2 中的 AlmaLinux 安装 perf :</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">dnf</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> perf</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+yi+`" alt=""></p><h4 id="_9-4-2-2-ubuntu-22-04" tabindex="-1">9.4.2.2 Ubuntu 22.04 <a class="header-anchor" href="#_9-4-2-2-ubuntu-22-04" aria-label="Permalink to "9.4.2.2 Ubuntu 22.04""></a></h4><ul><li>在 WSL2 中的 Ubuntu 安装 perf :</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">apt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> update</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">apt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> linux-tools-common</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> linux-tools-generic</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> linux-tools-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">uname</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -r</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p><img src="`+Fi+'" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>之所以报错的原因,在于 WSL2 中的 Ubuntu 的内核是定制化的,并非 Ubuntu 的母公司 Canonical 发布的标准内核,所以需要我们手动编译安装。</p></div><ul><li>查看内核版本:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">uname</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -sr</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+_i+'" alt=""></p><ul><li>设置环境变量,方便后续引用:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> KERNEL_VERSION</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">uname</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -r</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> cut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'-'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -f1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+vi+`" alt=""></p><ul><li>安装依赖库:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">apt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> update</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> apt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> binutils-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> debuginfod</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> default-jdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> default-jre</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libaio-dev</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libbabeltrace-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libcap-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libdw-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libdwarf-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libelf-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libiberty-dev</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> liblzma-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libnuma-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libperl-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libpfm4-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libslang2-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libssl-dev</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libtraceevent-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libunwind-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libzstd-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libzstd1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> python3-setuptools</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> python3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> python3-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> systemtap-sdt-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> zlib1g-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dwarves</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bison</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> flex</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libnewt-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libdwarf++0</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libelf++0</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libbfb0-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> python-dev-is-python3</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p><img src="`+Bi+`" alt=""></p><ul><li>下载源码:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clone</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --depth</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --single-branch</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --branch=linux-msft-wsl-\${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">KERNEL_VERSION</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://github.com/microsoft/WSL2-Linux-Kernel.git</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p><img src="`+fi+'" alt=""></p><ul><li>编译内核代码:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> WSL2-Linux-Kernel</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">make</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -j</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">nproc</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">KCONFIG_CONFIG=Microsoft/config-wsl</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+Ai+'" alt=""></p><ul><li>编译 perf 工具:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> tools/perf</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">make</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clean</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">make</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+xi+'" alt=""></p><ul><li>复制到 PATH 变量所指向的路径中:</li></ul><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> perf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /usr/bin/</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="'+Di+'" alt=""></p><h3 id="_9-4-3-整合" tabindex="-1">9.4.3 整合 <a class="header-anchor" href="#_9-4-3-整合" aria-label="Permalink to "9.4.3 整合""></a></h3><ul><li>CLion 中配置 perf 的路径:</li></ul><p><img src="'+qi+'" alt=""></p><ul><li>在 CLion 中通过 perf 运行代码:</li></ul><p><img src="'+Si+'" alt=""></p><h2 id="_9-5-win-中文乱码问题" tabindex="-1">9.5 Win 中文乱码问题 <a class="header-anchor" href="#_9-5-win-中文乱码问题" aria-label="Permalink to "9.5 Win 中文乱码问题""></a></h2><ul><li>前文,我们提及到,在 Win 中,如果出现<code>中文乱码</code>问题,就需要去<code>语言和区别</code>设置<code>系统区域</code>的编码为 UTF-8 ;但是,这样可能会造成其它的软件出现中文乱码问题,如:Xshell 等。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① 之所以,修改系统的编码为 UTF-8 会出现问题,是因为早期的 Win 系统的中文默认编码是 GBK(目前也是,Win 并没有强制第三方软件使用 UTF-8 编码) ,而 Xshell 等也使用的这些编码,一旦我们修改为 UTF-8 之后,可能会造成这些第三方软件出现中文乱码问题(第三方软件适配问题,相信将来应该都会切换为 UTF-8 编码),体验较差!!!</li><li>② 在 Linux 或 MacOS 之所以不会出现中文乱码的问题,是因为这些系统默认的编码就是 UTF-8 。</li></ul></div><ul><li>其实,还有一种解决方案,如下所示:</li></ul><p><img src="'+wi+'" alt=""></p><p><img src="'+Li+'" alt=""></p><p><img src="'+Pi+'" alt=""></p><ul><li>测试一下,是否配置成功:</li></ul><p><img src="'+Ti+'" alt=""></p><h2 id="_9-6-clion-中自动导入头文件" tabindex="-1">9.6 CLion 中自动导入头文件 <a class="header-anchor" href="#_9-6-clion-中自动导入头文件" aria-label="Permalink to "9.6 CLion 中自动导入头文件""></a></h2><ul><li>在 CLion 中,最为强大的功能就是直接输入函数,然后让 IDE 帮我们自动导入头文件,包括自定义的头文件,相当实用。</li></ul><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><ul><li>① CLion 中的<code>自动导入头文件</code>的<code>快捷键</code>是 <code>Alt + Enter</code> 。</li><li>② CLion 中的<code>自动提取变量的类型</code>的<code>快捷键</code>是 <code>Ctrl + Alt + V</code> 。</li></ul></div><p><img src="'+Ui+'" alt=""></p><ul><li>开启自动导入头文件的步骤,如下所示:</li></ul><p><img src="'+Ii+'" alt=""></p><p><img src="'+Ri+'" alt=""></p>',665),Mi=[Wi];function Oi(Gi,Xi,Vi,Hi,$i,Ki){return i(),a("div",null,Mi)}const Qi=s(Ni,[["render",Oi]]);export{ji as __pageData,Qi as default};
|