国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux 開發(fā)工具vim、gcc/g++、makefile

這篇具有很好參考價值的文章主要介紹了Linux 開發(fā)工具vim、gcc/g++、makefile。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

Linux編輯器-vim

1. 基本概念

2. 基本操作

3. 正常模式命令集

4. 末行模式命令集

5. 其他操作

6. 簡單vim配置

Linux編譯器-gcc/g++

1、基本概念?

2、程序翻譯的過程

3. gcc如何完成程序翻譯

4、動靜態(tài)庫?

Linux項目自動化構(gòu)建工具-make/Makefile

1、背景

2、創(chuàng)建makefile

3、原理

5、項目清理(偽目標)

進度條小程序

1、緩沖區(qū)刷新

2、原理?

3、實現(xiàn)?


Linux編輯器-vim

1. 基本概念

vim的三種模式(目前掌握三種即可)分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區(qū)分如下:
正常/普通/命令模式(Normal mode)
  • 控制屏幕光標的移動,字符、字或行的刪除,移動復(fù)制某區(qū)段及進入Insert mode下,或者到 last line mode
插入模式(Insert mode)
  • 只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們后面用的最頻繁的編輯模式。
末行模式(last line mode)
  • 文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。 在命令模式下,shift+: 即可進入該模式。要查看你的所有模式:打開vim,底行模式直接輸入 :help vim-modes

2. 基本操作

進入vim,在系統(tǒng)提示符號輸入vim及文件名稱后,就進入vim全屏幕編輯畫面:
  • $ vim test.c ,進入vim之后,是處于[正常模式],要切換到[插入模式]才能夠輸入文字。
[正常模式]切換至[插入模式]
  • 輸入a
  • 輸入i
  • 輸入o
[插入模式]切換至[正常模式]
  • 目前處于[插入模式],就只能一直輸入文字,如果發(fā)現(xiàn)輸錯了字,想用光標鍵往回移動,將該字刪除,可以先按一下「ESC」鍵轉(zhuǎn)到[正常模式]再刪除文字。當然,也可以直接刪除。
[正常模式]切換至[末行模式]
  • 「shift + ;」, 其實就是輸入「:」
退出vim及保存文件,在[正常模式]下,按一下「:」冒號鍵進入「Last line mode」,例如:
  • : w (保存當前文件): wq (輸入「wq」,存盤并退出vim)
  • : q! (輸入q!,不存盤強制退出vim)

3. 正常模式命令集

插入模式
  • 按「i」切換進入插入模式「insert mode」,按“i”進入插入模式后是從光標當前位置開始輸入文件;
  • 按「a」進入插入模式后,是從目前光標所在位置的下一個位置開始輸入文字;
  • 按「o」進入插入模式后,是插入新的一行,從行首開始輸入文字。
從插入模式切換為命令模式
  • 按「ESC」鍵。
移動光標
  • vim可以直接用鍵盤上的光標來上下左右移動,但正規(guī)的vim是用小寫英文字母「h」、「j」、「k」、
  • 「l」,分別控制光標左、下、上、右移一格
  • 按「G」:移動到文章的最后
  • 按「 $ 」:移動到光標所在行的“行尾”
  • 按「^」:移動到光標所在行的“行首”
  • 按「w」:光標跳到下個字的開頭
  • 按「e」:光標跳到下個字的字尾
  • 按「b」:光標回到上個字的開頭
  • 按「#l」:光標移到該行的第#個位置,如:5l,56l
  • 按[gg]:進入到文本開始
  • 按[shift+g]:進入文本末端
  • 按「ctrl」+「b」:屏幕往“后”移動一頁
  • 按「ctrl」+「f」:屏幕往“前”移動一頁
  • 按「ctrl」+「u」:屏幕往“后”移動半頁
  • 按「ctrl」+「d」:屏幕往“前”移動半頁
刪除文字
  • 「x」:每按一次,刪除光標所在位置的一個字符
  • 「#x」:例如,「6x」表示刪除光標所在位置的“后面(包含自己在內(nèi))”6個字符
  • 「X」:大寫的X,每按一次,刪除光標所在位置的“前面”一個字符
  • 「#X」:例如,「20X」表示刪除光標所在位置的“前面”20個字符
  • 「dd」:刪除光標所在行,dd+p實現(xiàn)剪切
  • 「#dd」:從光標所在行開始刪除#行
復(fù)制
  • 「yw」:將光標所在之處到字尾的字符復(fù)制到緩沖區(qū)中。
  • 「#yw」:復(fù)制#個字到緩沖區(qū)
  • 「yy」:復(fù)制光標所在行到緩沖區(qū)。
  • 「#yy」:例如,「6yy」表示拷貝從光標所在的該行“往下數(shù)”6行文字。
  • 「p」:將緩沖區(qū)內(nèi)的字符貼到光標所在位置。注意:所有與“y”有關(guān)的復(fù)制命令都必須與“p”配合才能完成復(fù)制與粘貼功能。
替換
  • 「r」:替換光標所在處的字符。
  • 「R」:替換光標所到之處的字符,直到按下「ESC」鍵為止。
  • [shift+r]?:進入替換模式
撤銷上一次操作
  • 「u」:如果您誤執(zhí)行一個命令,可以馬上按下「u」,回到上一個操作。按多次“u”可以執(zhí)行多次回復(fù)。
  • 「ctrl + r」: 撤銷的恢復(fù)
更改
  • 「cw」:更改光標所在處的字到字尾處
  • 「c#w」:例如,「c3w」表示更改3個字
跳至指定的行
  • 「ctrl」+「g」列出光標所在行的行號。
  • 「#G」:例如,「15G」,表示移動光標至文章的第15行行首。

大小寫切換

  • [shift]? +? [~]? ?按住不動可連續(xù)進行大小寫轉(zhuǎn)換。

4. 末行模式命令集

在使用末行模式之前,請記住先按「ESC」鍵確定您已經(jīng)處于正常模式,再按「:」冒號即可進入末行模式。
列出行號
  • 「set nu」: 輸入「set nu」后,會在文件中的每一行前面列出行號。
跳到文件中的某一行
  • 「#」:「#」號表示一個數(shù)字,在冒號后輸入一個數(shù)字,再按回車鍵就會跳到該行了,如輸入數(shù)字15,再回車,就會跳到文章的第15行。
查找字符
  • 「/關(guān)鍵字」: 先按「/」鍵,再輸入您想尋找的字符,如果第一次找的關(guān)鍵字不是您想要的,可以一直按 「n」會往后尋找到您要的關(guān)鍵字為止。
  • 「?關(guān)鍵字」:先按「?」鍵,再輸入您想尋找的字符,如果第一次找的關(guān)鍵字不是您想要的,可以一直 按「n」會往前尋找到您要的關(guān)鍵字為止。
保存文件
「w」: 在冒號輸入字母「w」就可以將文件保存起來
離開vim
  • 「q」:按「q」就是退出,如果無法離開vim,可以在「q」后跟一個「!」強制離開vim。
  • 「wq」:一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件。
  • !+q/w/wq 強制執(zhí)行命令

不退出vim執(zhí)行命令

  • !+命令

5. 其他操作

  • 使用vim打開一個不存在的文件,對該文件進行編輯后保存,vim會自動幫你創(chuàng)建該文件。
  • vs + 文件名:在當前窗口創(chuàng)建一個新的垂直分屏,并在其中打開指定的文件。

6. 簡單vim配置

配置文件的位置
  • 在目錄 /etc/ 下面,有個名為vimrc的文件,這是系統(tǒng)中公共的vim配置文件,對所有用戶都有效。
  • 而在每個用戶的主目錄下,都可以自己建立私有的配置文件,命名為:“.vimrc”。例如,/root目錄下,
  • 通常已經(jīng)存在一個.vimrc文件,如果不存在,則創(chuàng)建之。
  • 切換用戶成為自己執(zhí)行 su ,進入自己的主工作目錄,執(zhí)行 cd ~
  • 打開自己目錄下的.vimrc文件,執(zhí)行 vim .vimrc
常用配置選項,用來測試
  • 設(shè)置語法高亮: syntax on
  • 顯示行號: set nu
  • 設(shè)置縮進的空格數(shù)為4: set shiftwidth=4

Linux編譯器-gcc/g++

1、基本概念?

gcc是GNU Compiler Collection(GNU編譯器集合)的縮寫,是一個廣泛使用的編程工具,用于編譯和鏈接C、C++、Objective-C和其他語言的源代碼。

gcc主要用于將高級編程語言(如C、C++等)的源代碼轉(zhuǎn)換為可執(zhí)行文件或庫文件。它執(zhí)行以下主要任務(wù):

  1. 編譯:gcc將源代碼文件(如.c、.cpp等)編譯為機器代碼文件(如.o、.obj等)。編譯過程將源代碼轉(zhuǎn)換為匯編語言,然后再轉(zhuǎn)換為機器代碼。

  2. 鏈接:gcc將編譯生成的目標文件(.o、.obj等)以及所需的庫文件鏈接在一起,生成最終的可執(zhí)行文件或庫文件。鏈接過程將解析和解決符號引用,將多個目標文件和庫文件組合成一個完整的可執(zhí)行文件。

除了編譯和鏈接源代碼,gcc還提供了許多選項和功能,用于優(yōu)化代碼、調(diào)試程序、生成調(diào)試信息、處理預(yù)處理指令等。

2、程序翻譯的過程

程序需要被翻譯成二進制計算機才能讀懂
  1. 預(yù)處理(進行去注釋、宏替換、頭文件展開、條件編譯)
  2. 編譯(C/C++ >>> 匯編)
  3. 匯編(匯編 >> 可重定向二進制目標文件)
  4. 連接(鏈接多個 .o .obj 合并形成可執(zhí)行文件.exe)

3. gcc如何完成程序翻譯

格式 gcc [選項] 要編譯的文件 [選項] [目標文件]
預(yù)處理(進行宏替換)
  • 預(yù)處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。
  • 預(yù)處理指令是以#號開頭的代碼行。
  • 實例:?gcc -E hello.c -o hello.i
    • 選項“-E”,該選項的作用是讓 gcc 在預(yù)處理結(jié)束后停止編譯過程。
    • 選項“-o”是指目標文件,“.i”文件為已經(jīng)過預(yù)處理的C原始程序,-o后面緊跟生成的目標文件。
編譯(生成匯編)
  • 在這個階段中,gcc 首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查
  • 無誤后,gcc 把代碼翻譯成匯編語言。
  • 選項“-S”:從現(xiàn)在開始進行程序的翻譯,如果編譯完成就停下來。
  • 實例: gcc –S hello.i –o hello.s
匯編(生成機器可識別代碼)
  • 匯編階段是把編譯階段生成的“.s”文件轉(zhuǎn)成目標文件(二進制文件)。
  • 選項“-c”從現(xiàn)在開始進行程序的翻譯,如果匯編完成就停下來。
  • 實例: gcc –c hello.s –o hello.o
鏈接(生成可執(zhí)行文件或庫文件)
  • 在成功編譯之后,就進入了鏈接階段。
  • 實例: gcc hello.o –o hello

4、動靜態(tài)庫?

在這里涉及到一個重要的概念:函數(shù)庫
頭文件提供方法列表,庫提供方法的實現(xiàn)。
  • 在我們的C程序中,雖然沒有定義“printf”函數(shù)的實現(xiàn),且在預(yù)編譯中包含的“stdio.h”中只有該函數(shù)的聲明,但實際上,“printf”等標準庫函數(shù)的實現(xiàn)被存放在名為?libc.so.6?的庫文件中。
  • 當使用gcc編譯時,如果沒有特別指定,它會默認在系統(tǒng)的搜索路徑(通常是/usr/lib)下查找這個庫文件。通過鏈接到libc.so.6,程序能夠?qū)崿F(xiàn)對“printf”等函數(shù)的調(diào)用,這就是鏈接階段的作用。
函數(shù)庫一般分為靜態(tài)庫和動態(tài)庫兩種。

在Linux系統(tǒng)中,庫文件主要有兩種形式:動態(tài)庫(.so文件)和靜態(tài)庫(.a文件)。相應(yīng)地,在Windows系統(tǒng)中,這兩種類型的庫文件分別以.dll(動態(tài)庫)和.lib(靜態(tài)庫)作為后綴名。

靜態(tài)庫在編譯鏈接過程中,將庫文件中的代碼全部加入到生成的可執(zhí)行文件中。這種方式會導致可執(zhí)行文件體積較大,但好處是運行時不再依賴外部的庫文件。靜態(tài)庫文件在Linux中一般以.a作為后綴名。

動態(tài)庫的處理方式則不同,它在編譯鏈接時不會將庫文件的代碼直接加入到可執(zhí)行文件中。

  • 相反,程序在運行時會動態(tài)地加載所需的庫文件。這種方式可以減少系統(tǒng)資源的占用,因為多個程序可以共享同一個庫文件的單個副本。
  • 動態(tài)庫文件在Linux中的后綴名通常為.so,例如之前提到的libc.so.6便是一個動態(tài)庫。
  • 在編譯時,GCC默認采用動態(tài)庫鏈接,從而生成的二進制程序通常是動態(tài)鏈接的。這一點可以通過使用file命令來驗證。例如,編譯生成可執(zhí)行文件的命令可以是:gcc hello.o -o hello,這里GCC會默認鏈接到動態(tài)庫。
gcc選項
  • -E 只激活預(yù)處理,這個不生成文件,你需要把它重定向到一個輸出文件里面
  • -S? 編譯到匯編語言不進行匯編和鏈接
  • -c? 編譯到目標代碼
  • -o 文件輸出到 文件
  • -static 此選項對生成的文件采用靜態(tài)鏈接
  • -g?生成調(diào)試信息。GNU 調(diào)試器可利用該信息。
  • -shared?此選項將盡量使用動態(tài)庫,所以生成文件比較小,但是需要系統(tǒng)由動態(tài)庫.
  • -O0 -O1 -O2 -O3
    • 編譯器的優(yōu)化選項的4個級別,-O0表示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高
  • -w? 不生成任何警告信息。
  • -Wall 生成所有警告信息。

Linux項目自動化構(gòu)建工具-make/Makefile

1、背景

  • 會不會寫makefile,從一個側(cè)面說明了一個人是否具備完成大型工程的能力
  • 一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復(fù)雜的功能操作
  • makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率。
  • make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數(shù)的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢?,makefile都成為了一種在工程方面的編譯方法。
  • make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構(gòu)建。

2、創(chuàng)建makefile

要使用Makefile,您可以按照以下步驟進行:

1. 創(chuàng)建Makefile文件:在項目的根目錄或適當?shù)奈恢脛?chuàng)建一個名為“Makefile”(或“makefile”)的文件。

2. 定義目標和規(guī)則:在Makefile中,定義您的目標和相應(yīng)的規(guī)則。每個目標表示一個輸出文件,而規(guī)則則指定如何生成目標。

target: dependencies//依賴關(guān)系
? ? ? ? command//依賴方法

? ? 例如,如果您有一個C程序(如“hello.c”)需要編譯成可執(zhí)行文件(如“hello”),Makefile可能如下所示:

hello: hello.o
    gcc hello.o -o hello

hello.o: hello.c ? ? ? 
    gcc -c hello.c -o hello.o
  • hello: hello.o 就是依賴關(guān)系
  • gcc hello.o -o hello,就是依賴方法

3. 運行make命令:在命令行中,進入到包含Makefile的目錄,并運行`make`命令。

make

? ? 這將根據(jù)Makefile中的規(guī)則自動構(gòu)建項目。

這樣,Makefile就會根據(jù)定義的規(guī)則構(gòu)建和管理您的項目。這對于大型項目和多文件項目的構(gòu)建過程特別有用。

3、原理

hello: hello.o
    gcc hello.o -o hello

hello.o: hello.s
    gcc -c hello.s -o hello.o

hello.s: hello.i
    gcc -S hello.i -o hello.s

hello.i: hello.c
    gcc -E hello.c -o hello.i

.PHONY:clean
clean:
     rm -f hello.i hello.s hello.o hello
  • 上面的文件 hello ,它依賴 hell.o
  • hello.o , 它依賴 hello.s
  • hello.s , 它依賴 hello.i
  • hello.i , 它依賴 hello.c
  1. 尋找Makefile:Make首先在當前目錄下尋找名為“Makefile”或“makefile”的文件。
  2. 確定目標文件:在Makefile中,Make會查找第一個目標(target),例如“hello”,并將其作為構(gòu)建過程的最終目標。
  3. 檢查文件依賴和更新:如果目標文件“hello”不存在,或者它依賴的文件(如“hello.o”)比“hello”更新(這可以通過touch命令模擬),Make將執(zhí)行相應(yīng)的命令來生成“hello”文件。
  4. 遞歸解析依賴:如果“hello”依賴的“hello.o”文件不存在,Make會在Makefile中尋找生成“hello.o”的規(guī)則,并遞歸地解析直到所有依賴都被構(gòu)建。這個過程類似于堆棧操作,Make會一層層地解析文件依賴關(guān)系,直到所有必需的文件都被編譯或更新。
  5. 編譯和構(gòu)建:在所有的C文件和H文件存在的情況下,Make將根據(jù)規(guī)則生成“hello.o”文件,然后使用它來完成最終目標“hello”的構(gòu)建。

Make的核心在于管理文件之間的依賴關(guān)系。它會一步步地檢查和滿足這些依賴,直到達到最終的構(gòu)建目標。如果在解析依賴的過程中遇到無法找到的文件,Make會停止并報錯。然而,對于命令執(zhí)行錯誤或編譯失敗,Make不會中斷其過程,因為它主要關(guān)注的是文件依賴性。

總結(jié)來說,Make通過逐層解析和滿足文件依賴,自動化地管理編譯過程。這種方式極大地簡化了復(fù)雜項目的構(gòu)建過程,使開發(fā)者能夠?qū)W⒂诖a開發(fā),而不是構(gòu)建過程的每一個細節(jié)。

5、項目清理(偽目標)

工程是需要被清理的,這時我們需要一個clean并設(shè)置為偽目標。

?偽目標是指在Makefile中聲明的目標,其對應(yīng)的文件實際上并不存在。通過使用 .PHONY 修飾,我們告訴make工具這個目標不代表一個真實的文件,而是一個標簽,因此,make 不會檢查目標對應(yīng)的文件是否存在或者文件的修改時間。

  1. 無實際文件關(guān)聯(lián):?偽目標通常沒有對應(yīng)的實際文件,因此不會通過比較文件的時間戳來判斷是否需要重新生成。

  2. 總是執(zhí)行規(guī)則:?因為偽目標不代表一個真實的文件,所以make無法判斷其最后修改時間,從而總是執(zhí)行與之關(guān)聯(lián)的規(guī)則。

  3. 依賴關(guān)系執(zhí)行:?偽目標可能有依賴關(guān)系,當其依賴的文件發(fā)生變化時,偽目標及其關(guān)聯(lián)的規(guī)則會被執(zhí)行。

通過將清理操作(如clean目標)設(shè)置為偽目標,確保在每次執(zhí)行make時都會執(zhí)行清理操作,而不受實際文件的存在與否的影響。這對于確保在構(gòu)建過程中始終處于干凈狀態(tài)是很有用的。

Linux 開發(fā)工具vim、gcc/g++、makefile,Linux,linux,vim,服務(wù)器,運維
  • 像clean這種,沒有被第一個目標文件直接或間接關(guān)聯(lián),那么它后面所定義的命令將不會被自動執(zhí)行, 不過,我們可以顯示要make執(zhí)行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。
  • 但是一般我們這種clean的目標文件,我們將它設(shè)置為偽目標,用 .PHONY 修飾,偽目標的特性是,總是被執(zhí)行的,總是會根據(jù)依賴關(guān)系執(zhí)行依賴方法。

例: 鏈接三個文件

其中makefile如下:?

[hbr@VM-16-9-centos lesson5]$ cat makefile 
mytest:test.o main.o
	gcc -o mytest test.o main.o
test.o:test.c
	gcc -c test.c -o test.o
main.o:main.c
	gcc -c main.c -o main.o

.PHONY:clean
clean:
	rm -f *.o mytest

Linux 開發(fā)工具vim、gcc/g++、makefile,Linux,linux,vim,服務(wù)器,運維

進度條小程序

1、緩沖區(qū)刷新

[hbr@VM-16-9-centos program1]$ touch test.c
[hbr@VM-16-9-centos program1]$ vim test.c
[hbr@VM-16-9-centos program1]$ cat test.c 
#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("hello\n");
    sleep(3);
    return 0;
}
[hbr@VM-16-9-centos program1]$ gcc test.c 
[hbr@VM-16-9-centos program1]$ ls
a.out  makefile  proc  proc.c  test.c
[hbr@VM-16-9-centos program1]$ ./a.out 
hello
[hbr@VM-16-9-centos program1]$ vim test.c
[hbr@VM-16-9-centos program1]$ cat test.c 
#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("hello");
    sleep(3);
    return 0;
}
[hbr@VM-16-9-centos program1]$ gcc test.c 
[hbr@VM-16-9-centos program1]$ ./a.out 

第一次輸出時:先輸出Hello然后3秒后結(jié)束。

第二次去掉“\n”輸出時:先等待三秒然后輸出Hello后結(jié)束。

當?shù)谝淮螆?zhí)行編譯后的程序時,程序會立即輸出"hello",然后等待3秒鐘后結(jié)束。這是因為printf函數(shù)遇到換行符\n時,會立即刷新輸出緩沖區(qū),使得"hello"緊接著被輸出到屏幕上。

而在第二次執(zhí)行時,由于從printf的字符串中移除了換行符\n,輸出的行為有所不同。

  • 在這種情況下,printf輸出的"hello"首先被存儲在輸出緩沖區(qū)中,并不會立即顯示。
  • 由于C語言的輸出緩沖區(qū)是根據(jù)特定的刷新策略來刷新的,對于到顯示器這種設(shè)備,其一般的刷新策略是在遇到換行符\n時進行刷新。
  • 因此,當沒有換行符引導的直接刷新時,輸出緩沖區(qū)會等待直到程序結(jié)束或遇到其他刷新條件才進行刷新。這就是為什么在移除\n后,"hello"會在等待了3秒后才顯示出來的原因。

2、原理?

\n換行本質(zhì)上是:換行(到下一行)+回車(到行首),先看代碼。

[hbr@VM-16-9-centos program1]$ vim test.c 
[hbr@VM-16-9-centos program1]$ cat test.c 
#include <stdio.h>
#include <unistd.h>

int main()
{
    int n = 6;
    while(n >= 0)
    {
        printf("n=%d\n",n);
        n--;
        sleep(1);
    }
    return 0;
}
[hbr@VM-16-9-centos program1]$ gcc test.c 
[hbr@VM-16-9-centos program1]$ ./a.out 
n=6
n=5
n=4
n=3
n=2
n=1
n=0
[hbr@VM-16-9-centos program1]$ vim test.c //\n換成\r
[hbr@VM-16-9-centos program1]$ gcc test.c 
[hbr@VM-16-9-centos program1]$ ./a.out //沒有輸出結(jié)果
[hbr@VM-16-9-centos program1]$ vim test.c 
[hbr@VM-16-9-centos program1]$ cat test.c 
#include <stdio.h>
#include <unistd.h>

int main()
{
    int n = 6;
    while(n >= 0)
    {
        printf("n=%d\r",n);
        n--;
        fflush(stdout);
        sleep(1);
    }
    return 0;
}
[hbr@VM-16-9-centos program1]$ gcc test.c 
[hbr@VM-16-9-centos program1]$ ./a.out 
[hbr@VM-16-9-centos program1]$//會按照倒計時輸出,此處不方便展示效果
  • 第一個示例中,\n用于在每次輸出后換行并回到行首,這是標準的行為,使得每個輸出結(jié)果都在新的一行顯示,因此可以看到從n=6遞減到n=0的過程,每個數(shù)字都在新的一行上。
  • 然而,將\n替換為\r時,行為發(fā)生了變化。在計算機中,\r是回車符,它的作用是將光標移回行首,但不會進入新行。這意味著如果只用\r而不是\n,所有的輸出都會在同一行上發(fā)生,而且后面的輸出會覆蓋前面的輸出。
  • 在沒有fflush(stdout);的情況下,由于輸出緩沖區(qū)不會因\r而刷新,可能在程序執(zhí)行完畢之前看不到任何輸出。這是因為輸出緩沖區(qū)通常在滿了或者程序結(jié)束時才會自動刷新,導致在第二次嘗試中看不到輸出結(jié)果。
  • 引入fflush(stdout);后,每次調(diào)用printf之后立即強制刷新輸出緩沖區(qū),使得即使是\r也能即時看到效果。這導致光標回到行首,然后用新的數(shù)字覆蓋舊的數(shù)字,實現(xiàn)了一個簡單的倒計時效果。因為光標每次都回到行首,而且立即刷新,所以你可以看到n的值從6遞減到0,但這個過程中你只會在屏幕上看到一個數(shù)字的變化,而不是多行輸出。

3、實現(xiàn)?

該程序的可視化效果是一個逐步填充的進度條,旁邊有一個旋轉(zhuǎn)的符號表示進度正在進行,直到進度條完全填滿,并顯示100%。通過這種方式,可以在執(zhí)行較長時間的操作時給用戶一個視覺上的反饋。

[hbr@VM-16-9-centos program1]$ tree
.
├── makefile
├── proc.c
└── test.c

0 directories, 3 files
[hbr@VM-16-9-centos program1]$ cat makefile 
proc:proc.c
	gcc -o proc proc.c

.PHONY:clean
clean:
	rm -f proc
[hbr@VM-16-9-centos program1]$ vim proc.c 
[hbr@VM-16-9-centos program1]$ cat proc.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define NUM 51

int main()
{
    char bar[NUM];
    memset(bar,0,sizeof(bar));
    const char *lable="|/-\\";
    int i=0;
    while(i<=50)
    {
        printf("[%-50s][%d%%] %c\r",bar,i*2,lable[i%4]);
        bar[i++]='#';
        fflush(stdout);
        usleep(30000);
    }
    printf("\n");
    return 0;
}
[hbr@VM-16-9-centos program1]$ make
gcc -o proc proc.c
[hbr@VM-16-9-centos program1]$ ls
makefile  proc  proc.c  test.c
[hbr@VM-16-9-centos program1]$ ./proc
[##################################################][100%] -

proc.c中,定義了一個進度條,使用字符數(shù)組bar來模擬進度條的填充情況,并通過循環(huán)逐漸增加bar數(shù)組中的#字符數(shù)量來表示進度的增加。下面是代碼的逐行解釋:文章來源地址http://www.zghlxwxcb.cn/news/detail-838334.html

  1. 包含必要的頭文件stdio.h(用于輸入輸出)、string.h(用于內(nèi)存操作),和unistd.h(用于usleep函數(shù),暫停執(zhí)行)。
  2. 定義宏NUM為51,這個值用于定義字符數(shù)組bar的長度。
  3. main函數(shù)中,聲明字符數(shù)組bar并通過memset函數(shù)將其初始化為全0,這意味著開始時進度條是空的。
  4. 定義一個字符串lable,包含四個字符"|/-\\",用于在進度條旁邊顯示旋轉(zhuǎn)的效果,模仿一個正在進行的操作。
  5. 使用while循環(huán),條件為i小于等于50,這意味著進度條的最大填充長度為50個#字符。
  6. 在循環(huán)內(nèi)部,使用printf函數(shù)打印進度條。[%-50s]用于左對齊打印字符串bar,寬度固定為50個字符;[%d%%]顯示當前進度的百分比,因為循環(huán)是到50,所以用i*2來計算百分比;%c用于打印旋轉(zhuǎn)符號,通過lable[i%4]選擇"|/-\\"中的一個字符,隨著i的增加而變化。
  7. 每次循環(huán)時,將bar[i]設(shè)置為#,通過遞增i來模擬進度條的填充。
  8. 使用fflush(stdout)強制刷新標準輸出,確保每次循環(huán)的輸出都能立即顯示而不是等緩沖區(qū)滿。
  9. usleep(30000)暫停30毫秒(30000微秒),這樣用戶可以看到進度條的逐步填充和旋轉(zhuǎn)符號的動態(tài)變化。
  10. 循環(huán)結(jié)束后,打印一個換行符\n,以避免在命令行提示符出現(xiàn)之前光標停留在進度條的末尾。
  11. 函數(shù)返回0,表示程序正常結(jié)束。

到了這里,關(guān)于Linux 開發(fā)工具vim、gcc/g++、makefile的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux:基礎(chǔ)開發(fā)工具之yum,vim,gcc的使用

    Linux:基礎(chǔ)開發(fā)工具之yum,vim,gcc的使用

    本篇主要總結(jié)的是Linux下開發(fā)工具 yum vim gcc/g++ 什么是yum? 不管是在手機移動端還是 pc 端,不管是什么操作系統(tǒng),當用戶想要下載一些內(nèi)容或者工具的時候,都需要到一個特定的位置進行下載,例如在手機上,要下載一些應(yīng)用的時候就可以去對應(yīng)的應(yīng)用商店下載 而在Linux系統(tǒng)

    2024年02月08日
    瀏覽(50)
  • Linux開發(fā)工具-vim-gcc-gdb指令及使用

    Linux開發(fā)工具-vim-gcc-gdb指令及使用

    目錄 linux軟件包管理器yum(apt) linux開發(fā)工具 linux編輯器-vim使用 linux編譯器-gcc/g++使用 linux調(diào)試器-gdb使用 linux項目自動化構(gòu)建工具-make/makefile linux第一個小程序-進度條 使用github創(chuàng)建項目 使用git命令 我們前面學了關(guān)于linux的基本指令和基本權(quán)限的一些相關(guān)知識,那么我們今天

    2024年03月10日
    瀏覽(28)
  • Linux基礎(chǔ)環(huán)境開發(fā)工具的使用(yum,vim,gcc,g++)

    Linux基礎(chǔ)環(huán)境開發(fā)工具的使用(yum,vim,gcc,g++)

    首先先說明一點: Centos系統(tǒng)適用于yum 而Ubanto適用于apt-get 在Linux中我們也要進行工具/程序/指令的安裝,檢查和卸載, 而我們安裝軟件的方式: 1.源代碼安裝-需要進行交叉編譯的工作 一般那些很強的程序員中的大佬才能拿捏 2.rpm包直接安裝,也很麻煩 3.yum直接安裝 這就需要用到y(tǒng)

    2024年02月06日
    瀏覽(52)
  • 【Linux】Linux工具篇(yum、vim、gcc/g++、gdb、Makefile、git)

    【Linux】Linux工具篇(yum、vim、gcc/g++、gdb、Makefile、git)

    ?? 作者簡介:一名在后端領(lǐng)域?qū)W習,并渴望能夠?qū)W有所成的追夢人。 ?? 個人主頁:不 良 ?? 系列專欄:??Linux ? ??C++ ?? 學習格言:博觀而約取,厚積而薄發(fā) ?? 歡迎進來的小伙伴,如果小伙伴們在學習的過程中,發(fā)現(xiàn)有需要糾正的地方,煩請指正,希望能夠與諸君一

    2024年02月12日
    瀏覽(21)
  • Linux中的工具:yum,vim,gcc/g++,make/makefile,gdb

    Linux中的工具:yum,vim,gcc/g++,make/makefile,gdb

    目錄 1、yum 1.1 查看軟件包: ?1.2 安裝軟件包 1.3 卸載軟件 2、vim 2.1 vim的三種模式 2.2 vim的基本操作 2.3. vim正常模式命令集 2.3.1 插入模式 2.3.2 移動光標 2.3.3 刪除文字 2.3.4 復(fù)制 2.3.5 替換 2.3.6撤銷上一次操作 2.3.7 更改 2.3.8 跳至指定的行 2.4. vim末行模式命令集 3、gcc/g++ 3.1 預(yù)處理

    2024年02月10日
    瀏覽(24)
  • Linux基礎(chǔ)工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【詳解】

    Linux基礎(chǔ)工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【詳解】

    1.在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯, 得到可執(zhí)行程序。 2.但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在一個服務(wù)器上, 通過包管理器可以很方便的獲取到這個編譯好的軟件包

    2024年01月17日
    瀏覽(47)
  • 【Linux】vim(附配置sudo)、yum、gcc、g++、gdb、make/Makefile工具匯總

    【Linux】vim(附配置sudo)、yum、gcc、g++、gdb、make/Makefile工具匯總

    (一)歷史沉淀 我們在安裝一個軟件之前,需要先下載對應(yīng)的軟件包,但是這個軟件包并不存在于我們本地的計算機磁盤,而是存在于遠端服務(wù)器上;那么計算機如何知道該軟件存在于具體的哪一臺服務(wù)器上呢? 對于電腦來說,我們一般通過搜索對應(yīng)軟件的官網(wǎng)來得到相應(yīng)

    2024年02月13日
    瀏覽(56)
  • Linux開發(fā)工具Make/Makefile篇

    Linux開發(fā)工具Make/Makefile篇

    我們使用gcc/g++編譯代碼時,每次都要輸入一長串的指令,對于單個文件或者文件較少的時候,我們還能接受,可是當文件較多的時候,我們再一個一個編譯,就會比較麻煩。Linux中 make 命令加上 Makefile 文件搭配使用,就可以完成項目的自動化構(gòu)建。 C代碼 創(chuàng)建makefile文件 寫入

    2024年02月12日
    瀏覽(25)
  • Linux基礎(chǔ)——Linux開發(fā)工具(make/makefile,git)

    Linux基礎(chǔ)——Linux開發(fā)工具(make/makefile,git)

    前言:在經(jīng)過前面兩篇學習,大家對Linux開發(fā)工具都有一定的了解,而在此之前最重要的兩個工具就是vim,gcc。 如果對這兩個工具不太了解,可以先閱讀這兩篇文章: Linux開發(fā)工具 (vim) Linux開發(fā)工具 (gcc/g++) 首先讓我們來初步了解一下本篇的目標: 1. 學習make/makefile,并能簡單

    2024年04月27日
    瀏覽(31)
  • 『Linux升級路』基礎(chǔ)開發(fā)工具——make/Makefile篇

    『Linux升級路』基礎(chǔ)開發(fā)工具——make/Makefile篇

    ?? 博客主頁: 小王又困了 ?? 系列專欄: Linux ?? 人之為學,不日近則日退? ?? 感謝大家點贊??收藏?評論?? 目錄 一、認識make/Makefile ??1.1make/Makefile的優(yōu)點 ??1.2make/Makefile的使用 二、依賴關(guān)系和依賴方法 ??2.1依賴關(guān)系 ??2.2依賴方法 三、make工作原理 ??? 前言:

    2024年02月05日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包