1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        編程規(guī)范 | 關(guān)于頭文件的幾條規(guī)范

        共 2607字,需瀏覽 6分鐘

         ·

        2022-01-19 11:34

        ????關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

        來(lái)源:Bearoom


        一般來(lái)說(shuō),每一個(gè).c或者.cpp文件對(duì)應(yīng)一個(gè)頭文件(.h文件),當(dāng)然,也有例外,例如一些測(cè)試單元或者main文件,頭文件的一些規(guī)范可以令代碼可讀性、程序的性能等大為改觀,所以還是要注意頭文件的規(guī)范問(wèn)題。

        一、#define保護(hù)

        所有頭文件為了防止文件被多重包含(multiple inclusion),一般就需要#define保護(hù)。#define保護(hù)的格式如下:

        ___H_

        例如:

        #ifndef?FOO_BAR_BARZ_H_
        #define?FOO_BAR_BARZ_H_

        ...

        #endif?//FOO_BAR_BARZ_H_

        這個(gè)是比較老的一個(gè)做法了,所以很多編譯器基本都是可以兼容的,但是還有另一個(gè)語(yǔ)句也是可以起到相同作用,但是一些太老的編譯器據(jù)說(shuō)用不了的(但是我好像沒(méi)遇到過(guò)),VS下好像默認(rèn)新建一個(gè)類的頭文件就會(huì)用這個(gè)新的:

        #program?once

        這一種相對(duì)于第一種的好處是,不通過(guò)#define一個(gè)變量來(lái)起到防止重復(fù)包含,所以,不存在重復(fù)變量的問(wèn)題,#define后面的變量在同一個(gè)工程里是不能重復(fù)的,重復(fù)的話是只認(rèn)一個(gè)的,就可能導(dǎo)致另一個(gè)文件編譯的時(shí)候被排除。

        二、頭文件依賴

        在頭文件中減少包含其他頭文件,改用前置聲明(forward declarations),理由是:頭文件被包含的同時(shí)會(huì)引入一項(xiàng)新的依賴(dependency),只要頭文件被修改,代碼就要重新編譯,如果你的頭文件包含了其它頭文件,這些頭文件的任何改動(dòng)都將導(dǎo)致那些包含了你的頭文件的代碼重新編譯。

        使用前置聲明就是在頭文件中添加:

        class?Foo;

        然后在對(duì)應(yīng)的源文件中包含對(duì)應(yīng)的頭文件

        #include?

        可以這么做的幾種情況:

        1)、將數(shù)據(jù)聲明為指針(Foo*)或者引用(Foo&);

        2)、參數(shù)、返回值為Foo的函數(shù)只聲明不定義;

        3)、靜態(tài)數(shù)據(jù)成員可以被聲明為Foo,因?yàn)殪o態(tài)數(shù)據(jù)成員的定義在類定義之外;

        但是,如果你的類是Foo的子類或者包含類型為Foo的非靜態(tài)成員數(shù)據(jù),則必須包含頭文件。

        補(bǔ)充說(shuō)明,什么是聲明,什么是定義,一般在頭文件中經(jīng)??吹揭粋€(gè)函數(shù),有返回值有輸入?yún)?shù),但是沒(méi)有主體,或者一個(gè)變量聲明為指針,但是沒(méi)有new等操作,像這樣的就是聲明:

        Foo?*pFoo;
        void?setInputNumber(int?num);

        然后是定義,定義的話就是有函數(shù)主體,或者說(shuō)就有變量的內(nèi)存操作,包括非指針變量的聲明也已經(jīng)包含了定義,像這樣的:

        int?nInputNumber;
        int?nCount?=?0;
        pFoo=?new?Foo();

        void?setInputNumber(int?num)
        {
        ????nInputNumber?=?num;
        }

        三、內(nèi)聯(lián)函數(shù)

        當(dāng)函數(shù)小于10行的時(shí)候可以定義為內(nèi)聯(lián)函數(shù)(inline function)。

        定義:當(dāng)函數(shù)被聲明為內(nèi)聯(lián)函數(shù)后,編譯器會(huì)將其內(nèi)聯(lián)展開(kāi),無(wú)需像通常的函數(shù)調(diào)用機(jī)制一樣來(lái)調(diào)用內(nèi)聯(lián)函數(shù)。

        優(yōu)點(diǎn):可以令目標(biāo)代碼更高效。適合存取函數(shù)或一些較短的關(guān)鍵代碼。

        缺點(diǎn):濫用內(nèi)聯(lián)適得其反,內(nèi)斂較大代碼(如果編譯器允許),將增加代碼量;

        不可用或者盡量不要用內(nèi)聯(lián)函數(shù)的情況:

        1)、超過(guò)10行代碼;

        2)、析構(gòu)函數(shù);

        3)、遞歸函數(shù)(可能大多數(shù)編譯器不支持);

        4)、包含循環(huán)或者switch語(yǔ)句的函數(shù);

        四、頭文件包含實(shí)現(xiàn)代碼

        一般來(lái)說(shuō),頭文件是只包含聲明,而不要包含實(shí)現(xiàn)代碼的,但是用到內(nèi)聯(lián)函數(shù)或者函數(shù)模板的話就需要將代碼實(shí)現(xiàn)寫(xiě)在一起,為了可讀性,是可以新建一個(gè)后綴為-inl.h的頭文件,專門用于存放內(nèi)聯(lián)函數(shù)和模板函數(shù),這樣可以增強(qiáng)代碼可讀性。

        需要注意,這樣的頭文件也要加#define保護(hù)的。

        五、函數(shù)參數(shù)順序(Function Parameter Ordering)

        順序:輸入?yún)?shù)在前,輸入輸出參數(shù)居中,輸出參數(shù)在后。

        或者:輸入?yún)?shù)在前,輸入輸出參數(shù)居中,輸出參數(shù)在后,控制參數(shù)墊后。

        輸入?yún)?shù)一般為傳值或者常數(shù)引用(const references),輸出或者輸入輸出參數(shù)一般為傳非常數(shù)指針(non-const pointers),有些參數(shù)是輸入?yún)?shù),但是屬于控制變量意義的參數(shù),那我是覺(jué)得應(yīng)該放最后面的。

        六、包含頭文件順序

        如果我有一個(gè)命名為Foo.h的頭文件以及一個(gè)對(duì)應(yīng)的Foo.cpp的源文件,那么,頭文件中的包含順序應(yīng)該是:

        C庫(kù) > C++庫(kù) > 其他庫(kù)的.h文件 > 項(xiàng)目?jī)?nèi)的.h文件;

        而源文件中的包含順序應(yīng)該是:

        #include?"Foo.h"?>?C庫(kù)?>?C++庫(kù)?>?其他庫(kù)的.h文件?>?項(xiàng)目?jī)?nèi)的.h文件

        還有一點(diǎn)強(qiáng)迫癥的可以將同目錄下的頭文件按首字母順序來(lái)排列。

        補(bǔ)充說(shuō)明,#include ""和#include <>的區(qū)別:

        1)、#include <>引用的是編譯器的類庫(kù)路徑里面的頭文件;一般編譯器會(huì)在編譯器設(shè)置的include目錄和系統(tǒng)中的INCLUDE環(huán)境變量中找頭文件;一般用于標(biāo)準(zhǔn)文件;

        2)、#include ""引用程序目錄的相對(duì)位置的頭文件;一般是先從當(dāng)前文件所在的文件夾內(nèi)找,找不到再去編譯器設(shè)置的include目錄或者系統(tǒng)的INCLUDE環(huán)境變量中找;一般用于自定義的文件。

        結(jié)語(yǔ)

        編程規(guī)范一方面是給機(jī)器看,提高代碼的效率,另一方面也非常重要的用于給人看,提高人的效率。上述規(guī)范不一定就完全正確或者必須這么做,只是給個(gè)建議,看別人代碼是超級(jí)累的一件事,簡(jiǎn)直想大呼這TM寫(xiě)的啥啊,何況更可怕的是看完發(fā)現(xiàn)這TM是我自己寫(xiě)的代碼,想死的心都有了,利人終利己,就算出錯(cuò)了也好意思找別人幫忙看啊。

        原文:https://www.cnblogs.com/Bearoom/p/11721800.html


        版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

        ???????????????? ?END ?????????????????

        關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。

        關(guān)注程序員編程基地,回復(fù)“pdf”獲取程序員必讀經(jīng)典書(shū)單,一起編程一起進(jìn)階。



        點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

        瀏覽 77
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            秘书与老板办公室做爰电影 | 国产精品自拍啪啪啪 | 豆花视频在线观看一区二区三区 | 大尺度电影欧美肉很多床戏很多 | 国产精品色网站 | 国产高清一级A片免费看少妃 | 久久天天色 | 欧美日韩在线看豆花 | 亚洲欧美激情小说另类 | 一级草逼视频 |