欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    td::pair


    對于一個程序員來說,只要寫過一個“hello world!”的C程序,就不得不用到#include指令,因為沒有#include “stdio.h”,就不可能輸出”hello world!”字符串,它除了可以在程序頭部包含庫函數(shù)頭文件的用法,其實還有很多強(qiáng)大的用法。今天我們就重新認(rèn)識一下這個貌不驚人的預(yù)處理指令。(如果有經(jīng)驗的程序員,可以直接跳過基礎(chǔ)部分,為了照顧不同程度的讀者,基礎(chǔ)用法也做詳細(xì)介紹。)

    文件搜索機(jī)制:雙引號模式

    include本意就是包含的意思,把另一個文件包含進(jìn)當(dāng)前文件中,有兩種模式:

    • #include “file1.h”
    • #include <file2.h>

    雙引號模式分為絕對路徑和相對路徑兩種模式。絕對路徑是指從根目錄開始按指定路徑搜索頭文件,“盤符:\”、“盤符:\”、“盤符:/”就是表示windows下的根目錄,形如:

    • #include “盤符:\路徑\文件名.擴(kuò)展名”
    • #include “盤符:\路徑\文件名.擴(kuò)展名”
    • #include “盤符:/路徑/文件名.擴(kuò)展名”

    在linux環(huán)境,只能是正斜杠/并且沒有盤符的概念,在windows環(huán)境里,這三種是等價的用法。

    相對路徑則是指從源文件所在的當(dāng)前路徑開始搜索頭文件,“.”就是當(dāng)前目錄,“..”就是當(dāng)前目錄的父目錄,最好只用正斜杠“/”用來連接目錄和目錄,或目錄和文件,雖然也可以用反斜杠,但最好養(yǎng)成windows和linux風(fēng)格的一致性,因為在實際開發(fā)中,幾乎都是用相相對路徑的方法來搜索頭文件,很好用絕對路徑的。好處顯而易見,就是靈活性強(qiáng),源文件目錄可以隨意移動,而不改變頭文件的搜索機(jī)制。舉例如下:

    1. #include “./file.ext”
    2. #include “file.ext”
    3. #include “./sub_path/file.ext”
    4. #include “sub_path/file.ext”
    5. #include “../file.ext”
    6. #include “../brother_path/file.ext”
    7. #include “../../uncle_path/file.ext”

    .”表示源文件所在的當(dāng)前目錄,“file.ext”表示文件,兩者用正斜杠連接,表示當(dāng)前目錄下的文件,注意,很多教程,甚至資深程序員說“./”是當(dāng)前目錄,是嚴(yán)重錯誤的!正斜杠只是連接符號。

    第一種和第二種是等價的用法,第二種只是第一種的簡化寫法。第三種和第四種用法是等價的,都表示當(dāng)前目錄的“子目錄”下的文件,第四種也省略了當(dāng)前目錄的寫法。第五種表示要使用的頭文件在父目錄下,第六種表示在兄弟目錄(父目錄的其它子目錄),第七種表示文件在“叔叔目錄”下。

    文件搜索機(jī)制:尖括號模式

    一般情況下,如果包含的是程序員自定義的頭文件,要用到雙引號模式的搜索機(jī)制,而且最好要用相對目錄模式。但是如果是C語言標(biāo)準(zhǔn)的庫函數(shù)頭文件,就用尖括號模式,會更加方便。在尖括號內(nèi)直接放入要包含的文件名即可。比如:

    • #include <stdio.h>
    • #include <stdlib.h>
    • #include<stdarg.h>

    尖括號本身就表示一個特定的目錄,所以不用像雙引號模式那樣顯式地指定頭文件路徑。在windows系統(tǒng)中,安裝不同的c語言IDE開發(fā)環(huán)境,標(biāo)準(zhǔn)庫函數(shù)的頭文件路徑都會不同,在同一個開發(fā)環(huán)境中,不同的庫函數(shù)所在的目錄也可能不一樣,當(dāng)然也可以一樣。

    比如在visual studio 2022中,以我個人的電腦為例,stdlio.h和stdlib.h都被安裝在:

    C:\Program Files (x86)\Windows Kits\Include.0.22621.0\ucrt

    而stdarg.h頭文件就被安裝在:

    C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.37.32822\include

    而在我個人電腦安裝的CLION2023環(huán)境里,stdlio.h和stdlib.h被安裝在:

    C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\x86_64-w64-mingw32\include

    而stdarg.h頭文件被安裝在:

    C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\lib\gcc\x86_64-w64-mingw32.1.0\include

    我們不用關(guān)心系統(tǒng)提供的標(biāo)準(zhǔn)頭文件的具體路徑,直接尖括號訪問即可。當(dāng)然,這些頭文件的目錄可以被修改成新的位置,但是必須要在對應(yīng)的IDE里設(shè)置,而不是簡單的移走,我要反復(fù)強(qiáng)調(diào)的是,千萬不要輕易這樣干。

    頭文件查找機(jī)制的進(jìn)階思考

    1)

    雙引號模式:預(yù)處理器會先在指定的路徑尋找頭文件,如果尋找不到會再到編譯器自身的路徑中去尋找(存放在IDE或操作系統(tǒng)的環(huán)境變量中)。

    尖括號:預(yù)處理只會到編譯器默認(rèn)的目錄中去尋找。

    2)

    程序員自定義的頭文件也可以使用尖括號模式訪問,比如#include <myheader.h>。有兩種方法,比如可以直接放在編譯器的默認(rèn)目錄里,比如include目錄,或者其他目錄,比如stdio.h所在的目錄里都可以。也可以在IDE中設(shè)置一個新的路徑的環(huán)境變量也可以。

    類似的上面情況,也可以反過來把標(biāo)準(zhǔn)庫函數(shù)用雙引號模式訪問,比如#include “stdio.h”,這兩種顛倒或混用的做法,我強(qiáng)烈不建議。

    如果你需要把源代碼編譯成靜態(tài)鏈接庫lib或者動態(tài)鏈接庫dll,提供給其他項目使用,就需要放到標(biāo)準(zhǔn)庫的目錄里,用尖括號訪問是合適的,如果想了解如何用C語言生成靜態(tài)或動態(tài)庫,可以看我專欄的相關(guān)文章。

    否則,尖括號和雙引號可以讓代碼閱讀者,能夠一眼分辨出哪些是自定義頭文件,哪些是標(biāo)準(zhǔn)頭文件,混用的情況下,會讓維護(hù)者迷惑,不是一種良好的編程實踐。

    包含防護(hù)機(jī)制

    頭文件的包含防護(hù)機(jī)制,非常重要,我在介紹預(yù)處理指令#pragma once、條件編譯指令的用法時,都提到過。

    include指令就是將頭文件的全部內(nèi)容原樣復(fù)制到當(dāng)前文件里,如果一個頭文件被間接或直接的多次被“包含”到當(dāng)前源文件,編譯的時候必然報錯。比如:

    //code.c
    #include “myheader.h”
    #include “other.h”
    //other.h
    #include “nyheader.h”

    這是最簡單的例子,在other.h里間接的重復(fù)包含了myheader.h文件的內(nèi)容。為了避免一個頭文件被多次重復(fù)包含進(jìn)同一個源文件的問題,要么使用在頭文件的頂部插入一條#pragma once指令,表示這個頭文件在同一個源文件里只能包含一次,關(guān)于#pragma指令的俄詳細(xì)用法,可以參見《段譽和語言》的相關(guān)文章,要么使用條件編譯指令,條件編譯指令的用法就成為頭文件包含防護(hù)機(jī)制,使用起來也很簡單,就是在頭文件的頂部插入如下一段代碼:

    #ifndef _MY_HEADER_H
    #define _MY_HEADER_H
    ......
    #endif/*my_header.h*/

    _MY_HEADER_H要替換為頭文件的文件名的大寫字母,當(dāng)這個頭文件第一次被包含時,標(biāo)識符 _MY_HEADER_H是沒有被定義的,所以#ifndef _MY_HEADER_H語句為真,里面內(nèi)容會被包含進(jìn)去,省略號指代的是頭文件內(nèi)容。當(dāng)這個頭文件第二次或多次被包含時,因為#ifndef _MY_HEADER_H已經(jīng)被定義了,所以#define _MY_HEADER_H為假,就不被執(zhí)行,就不會被重復(fù)包含。關(guān)于條件編譯指令的詳細(xì)用法,可以看《段譽和語言》的相關(guān)文章。

    include的本質(zhì):到底什么是“文件包含”

    include本意就是包含的意思,把另一個文件包含進(jìn)當(dāng)前文件中,實際上只要是文件內(nèi)容是文本格式,都可以被包含進(jìn)來,比如.c、.h、.txt都是文本格式,就可以被包含進(jìn)來。打個比方,讓下面這段代碼:

    #include <stdio.h>
    int main(){
    int x,y;
    x=3;
    y=2;
    printf(“%d\n”,x+y);
    return0;
    }

    我們完全可以把其中部分代碼放進(jìn)另一個文件,比如file.txt,然后包含進(jìn)來:

    #include <stdio.h>
    intmain(){
    int x,y;
    #include “file.txt”
    return 0;
    }
    //file.txt
    x = 3;
    y = 2;
    printf(“%d\n”,x+y);

    現(xiàn)實中,沒人會這樣寫,這個例子就是為了演示include的本質(zhì)局勢簡單的包含功能。而且照樣可以編譯通過。但是,我們一般約定俗成的吧源代碼保存為后綴為c的文件,函數(shù)的聲明保存后綴為h的文件。

    巧用這個特性,我們可以有很多使用有趣的用法,舉兩個例子分享一下。

    include化簡數(shù)組

    比如我們定義了一個數(shù)組,元素非常多,放在源程序里影響看代碼,可以放在另外的文本文件里保存,既讓代碼清爽,又易于修改和維護(hù)。比如:

    //src.c
    char *namelst[] = {
    #include “names.txt”
    };
    //names.txt
    “Tom”,
    “Jack”,
    ......
    “vicky”

    通過#include “names.txt”,會讓src.c文件清爽易讀,而又不用去關(guān)心數(shù)組元素的具體內(nèi)容。這里有個細(xì)節(jié)要說到,那就是:

    #include指令必須要獨占一行

    用#include包含文件時,一定要單獨占一行,也就是#include語句當(dāng)前行的前后必須都是空白。因為預(yù)處理器會將被包含的文件的全部內(nèi)容從當(dāng)前行的下一行開始插入,前后不為空白,就會出錯。

    之前我在另一篇講#include用法時,提到將大量數(shù)組元素包進(jìn)文本文件,有個粉絲測試發(fā)現(xiàn)int a[]={#include “items.txt”};報錯,編譯不通過,就是這個原因。

    include調(diào)試程序

    有時候我們需要對幾個代碼塊進(jìn)行調(diào)試,一般都是通過條件編譯指令來控制哪一個代碼塊生效,但是如果用include就會非常方便和省事,比如:

    int main(){
    ....
    //功能1:
    //#include “func1.txt”
    //功能2:
    //#include “func2.txt”
    ....

    當(dāng)我們需要調(diào)試代碼塊1的時候,只要去掉#include “func1.txt”前面的注釋就可以了,不挑食的就注釋掉,調(diào)試的就去掉注釋,非常的方便和間接,否則就必須要提哦啊見編譯指令,或者用注釋成塊掉。我這個例子非常簡單,反應(yīng)不出來include的作用,在這種簡單場景下,注釋更方便,在復(fù)雜的情況下,就會顯出include的省事。

    還有更重要的一個用法,有時候我們會需要再一個項目里包含多個源文件,每個源文件都有一個main函數(shù),因為main函數(shù)都對應(yīng)某個功能的程序,編譯肯定不給通過。

    我們常規(guī)且簡單的做法,就是一個main函數(shù)的源文件都單獨為一個項目,要么通過cmake來控制在同一時間只能有一個main函數(shù)來啟用。這個用法在我的另一篇文章里也有詳細(xì)的介紹過。

    今天我介紹另一個更加巧妙的辦法,因為cmake是微軟visual studio IDE的弱項,功能支持比較差,用起來還不如CLION里用的方便,但是有時候又需要使用VS,因為編譯器調(diào)試能力非常優(yōu)秀,所以我經(jīng)常這樣干:建立一個源文件:

    #include “main01.h”
    #include “main02.h”
    #include “main03.h”
    ......

    每個main文件里都有一個main函數(shù),需要調(diào)試的去掉注釋,不調(diào)試的就注釋掉。非常簡單好用,我放一個我的截圖如下:

    這個截圖是我的項目文件夾的組織結(jié)構(gòu),一個源.c的文件作為開關(guān)控制要編譯的頭文件,每個.h文件都對應(yīng)一個要調(diào)試的小功能。下面的圖2就是源文件的內(nèi)容:

    下面的圖就是其中一個要調(diào)試的功能,這里舉的是B.h 這個文件,其實后綴改為.c也沒問題,主要是為了不和源文件混淆。B.h的內(nèi)容如下,注意做上角的紅箭頭,指明了是B.H文件:

    本篇include介紹就寫到這里,其他有趣的玩法,請繼續(xù)關(guān)注我的技術(shù)專欄:段譽和語言。

    段譽,寫于合肥。

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有