<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2607字,需瀏覽 6分鐘

           ·

          2022-01-19 11:34

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

          來源:Bearoom


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

          一、#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è)語句也是可以起到相同作用,但是一些太老的編譯器據(jù)說用不了的(但是我好像沒遇到過),VS下好像默認(rèn)新建一個(gè)類的頭文件就會用這個(gè)新的:

          #program?once

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

          二、頭文件依賴

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

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

          class?Foo;

          然后在對應(yīng)的源文件中包含對應(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ǔ)充說明,什么是聲明,什么是定義,一般在頭文件中經(jīng)常看到一個(gè)函數(shù),有返回值有輸入?yún)?shù),但是沒有主體,或者一個(gè)變量聲明為指針,但是沒有new等操作,像這樣的就是聲明:

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

          然后是定義,定義的話就是有函數(shù)主體,或者說就有變量的內(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ù)后,編譯器會將其內(nèi)聯(lián)展開,無需像通常的函數(shù)調(diào)用機(jī)制一樣來調(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)、超過10行代碼;

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

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

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

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

          一般來說,頭文件是只包含聲明,而不要包含實(shí)現(xiàn)代碼的,但是用到內(nèi)聯(lián)函數(shù)或者函數(shù)模板的話就需要將代碼實(shí)現(xiàn)寫在一起,為了可讀性,是可以新建一個(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ù),那我是覺得應(yīng)該放最后面的。

          六、包含頭文件順序

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

          C庫 > C++庫 > 其他庫的.h文件 > 項(xiàng)目內(nèi)的.h文件;

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

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

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

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

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

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

          結(jié)語

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

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


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

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

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

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



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

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产1区在线观看 | 天天干天天二 | 久久久久成人免费视频 | 俺去也在线www色官网 | 免费一级婬片A片女人不叫 |