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

C++ 中到底是應(yīng)該include .h文件還是應(yīng)該include .cpp文件

這篇具有很好參考價值的文章主要介紹了C++ 中到底是應(yīng)該include .h文件還是應(yīng)該include .cpp文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

在閱讀一個較大的解決方案中,對于其他文件夾下的.h和.cpp文件,有時候#include“XXX.h”文件,有時候是#include“XXX.cpp”文件,而且二者還不能更換。下面就好好分析一下他們二者的區(qū)別。
?

測試

測試:XXX.h和XXX.cpp有沒有在解決方案里的差別

???????如果 .h 文件和 .cpp 文件都已經(jīng)添加在解決方案里,只要在 main 的頭文件中 include 對應(yīng)的 .h 文件即可。
??如果 .h 文件和 .cpp 文件不在解決方案里,可能在其他文件夾里,單獨(dú) include.h 文件就會報錯“error LNK2019: 無法解析的外部符號”。

????????但是單獨(dú) include.cpp 就能運(yùn)行了,而此時當(dāng)前 main.cpp 里面有沒有對應(yīng)的 .h 頭文件都可以正確運(yùn)行(因?yàn)?.h 文件里有 #pragma once 防止多次定義),

????????這個很好解釋,include 就是把對應(yīng)的代碼拷貝一份進(jìn)去,拷貝之后,自定義函數(shù)的定義本來就在使用前,有沒有頭文件的聲明都可以。為了驗(yàn)證 include 是不是就是將程序拷貝,做了實(shí)驗(yàn)驗(yàn)證。

????????在自定義函數(shù)使用前 #include“XXX.h” 用于函數(shù)的聲明(意思是在 main.cpp 最前面 #include“XXX.h),在 main 函數(shù)結(jié)束之后#include“XXX.cpp”,運(yùn)行果然正確。
??初步結(jié)論:說明當(dāng).h文件和.cpp文件不在解決方案里的時候,#include就是純粹的拷貝復(fù)制工作。但是當(dāng) .h 和 .cpp 文件在解決方案的情況需要進(jìn)一步驗(yàn)證。

????????同時也說明,.cpp 文件有沒有包含進(jìn)工程文件的情況是不同的。

探究

按照所有查到的信息都說明一點(diǎn)內(nèi)容:凡是#include的頭文件,都是把對應(yīng)的文件信息拷貝復(fù)制一份進(jìn)來。顯然這個籠統(tǒng)的概念是不對的。

??源程序->預(yù)處理->編譯和優(yōu)化->生成目標(biāo)文件->鏈接->可執(zhí)行文件
??參考之前我轉(zhuǎn)載的3篇博文C++編譯與鏈接的三部曲(強(qiáng)烈推薦看一看)。大致總結(jié)如下:
?

預(yù)處理(簡單替換)

??預(yù)處理做如下工作:

預(yù)處理器主要負(fù)責(zé)以下的幾處:
1.宏的替換
2.刪除注釋
3.處理預(yù)處理指令,如#include,#ifdef

編譯和優(yōu)化(高級語言->匯編語言)

詞法分析 – 識別單詞,確認(rèn)詞類;比如int i;知道int是一個類型,是一個關(guān)鍵字以及判斷i的名字是否合法。
語法分析 – 識別短語和句型的語法屬性;
語義分析 – 確認(rèn)單詞、短語和句型的語義特征;
代碼優(yōu)化 – 修辭、文本編輯;
代碼生成 – 生成譯文。
內(nèi)聯(lián)函數(shù)的替換就發(fā)生在這一階段。
C++ 中到底是應(yīng)該include .h文件還是應(yīng)該include .cpp文件

編譯的另一個重要方面就是編譯單元
??什么是編譯單元呢?簡單來說一個cpp文件就是一個編譯單元。
??在集成式的IDE中,我們往往點(diǎn)擊一下運(yùn)行便可以了,編譯的所有工作都交給了IDE去處理,往往忽略了其中的內(nèi)部流程。
??事實(shí)上編譯每個編譯單元(.cpp)時是相互獨(dú)立的,即每個cpp文件之間是不知道對方的存在的(不考慮#include “xxx.cpp" 這種奇葩的寫法)。
??編譯器會分別將每個編譯單元(.cpp)進(jìn)行編譯,生成相應(yīng)的obj文件,然后鏈接器會將所有的obj文件進(jìn)行鏈接,生成最終可執(zhí)行文件內(nèi)部鏈接與外部鏈接。
??這里能作為單獨(dú)編譯單元的是添加進(jìn)工程的cpp文件,外部文件夾的cpp文件并不單獨(dú)成為編譯單元。
?

生成目標(biāo)文件(匯編語言->二進(jìn)制機(jī)器語言)

??匯編過程實(shí)際上指把匯編語言代碼翻譯成目標(biāo)機(jī)器指令的過程。
??在最終的目標(biāo)文件中,編譯器把一個cpp編譯為目標(biāo)文件的時候,除了要在目標(biāo)文件里寫入cpp里包含的數(shù)據(jù)和代碼,還要至少提供3個表:

未解決符號表;
導(dǎo)出符號表;
地址重定向表

未解決符號表提供了所有在該編譯單元里引用但是定義并不在本編譯單元里的符號及其出現(xiàn)的地址;
??導(dǎo)出符號表提供了本編譯單元具有定義,并且愿意提供給其他編譯單元使用的符號及其地址。
??地址重定向表提供了本編譯單元所有對自身地址的引用的記錄。
??這就是不同cpp之間的通訊方式。

C++ 中到底是應(yīng)該include .h文件還是應(yīng)該include .cpp文件

從這個定義方式上看,主cpp文件和其他所有cpp文件都是平等的關(guān)系,只不過主cpp里面包含了main函數(shù)而已,而main函數(shù)和其他所有函數(shù)也是平等的,只不過只有main函數(shù)可以作為工程的入口函數(shù)而已。

鏈接(匯總成一個目標(biāo)文件)

由匯編程序生成的目標(biāo)文件并不能立即就被執(zhí)行,其中可能還有許多沒有解決的問題。例如,某個源文件中的函數(shù)可能引用了另一個源文件中定義的某個符號(如變量或者函數(shù)調(diào)用等);在程序中可能調(diào)用了某個庫文件中的函數(shù),等等。所有的這些問題,都需要經(jīng)鏈接程序的處理方能得以解決。
??由此,我們可以理解了經(jīng)常報錯的一些情況,就是未解決符號表和導(dǎo)出符號表之間沒有定義或者重復(fù)定義的情況的。
?

外部文件夾的h和cpp文件

外部文件夾的cpp文件并不能生成單獨(dú)的編譯文件,所以,不參與未解決符號表和導(dǎo)出符號表的生成,而#include外部的h頭文件也只是復(fù)制進(jìn)來頭文件中的函數(shù)聲明而已,沒有定義。所以當(dāng)需要使用外部文件夾的cpp文件的時候,直接在頭部加上#include cpp文件,或者在頭部#include h文件,尾部#include cpp文件,就相當(dāng)于我們平時寫的自定義函數(shù)一樣。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-447227.html

到了這里,關(guān)于C++ 中到底是應(yīng)該include .h文件還是應(yīng)該include .cpp文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【C++】源文件.cpp和頭文件.h分離編程

    【C++】源文件.cpp和頭文件.h分離編程

    將C++代碼分為頭文件(.h)和源文件(.cpp)的做法有以下幾個好處: 模塊化和代碼組織:將函數(shù)和類的聲明(包括函數(shù)原型、類的成員和屬性等)放在頭文件中,將函數(shù)和類的實(shí)現(xiàn)(具體的函數(shù)邏輯、成員函數(shù)的定義等)放在源文件中。這種分離有助于對代碼進(jìn)行模塊化和組

    2024年02月09日
    瀏覽(23)
  • dhcp應(yīng)該開啟還是關(guān)閉(dhcp應(yīng)該開啟還是關(guān)閉)

    最好是開啟。dhcp服務(wù)關(guān)閉后,上網(wǎng)設(shè)備需要手動設(shè)置ip地址才能上網(wǎng)。 1、開啟DHCP功能時,只要客戶端的狀態(tài)是自動獲取IP地址,服務(wù)器端就對客戶端動態(tài)的分配P地址。如果客戶端是手動配置好的IP地址,那么客戶端不會再去服務(wù)器端申請P地址了。 2、關(guān)閉DHCP功能時,自動獲

    2024年02月04日
    瀏覽(25)
  • 一個企業(yè)級的文件上傳組件應(yīng)該是什么樣的

    一個企業(yè)級的文件上傳組件應(yīng)該是什么樣的

    目錄 1.最簡單的文件上傳 2.拖拽+粘貼+樣式優(yōu)化 3.斷點(diǎn)續(xù)傳+秒傳+進(jìn)度條 文件切片 計(jì)算hash 斷點(diǎn)續(xù)傳+秒傳(前端) 斷點(diǎn)續(xù)傳+秒傳(后端) 進(jìn)度條 4.抽樣hash和webWorker 抽樣hash(md5) webWorker 時間切片 5.文件類型判斷 通過文件頭判斷文件類型 6.異步并發(fā)數(shù)控制(重要) 7.并發(fā)錯誤重試 8.慢

    2024年02月15日
    瀏覽(23)
  • C++ 判斷路徑為文件夾還是文件

    頭文件 Path ? 指定標(biāo)識文件的路徑名。根據(jù)所使用的接口,此名稱的解釋不同。如果指定了DirFileDescriptor并且Path是一個相對路徑名,那么Path被認(rèn)為是相對于DirFileDescriptor指定的目錄的。 Buffer 指定指向在其中返回信息的狀態(tài)結(jié)構(gòu)的指針。stat結(jié)構(gòu)在sys/stat.h文件中描述。 成功完

    2024年02月01日
    瀏覽(539)
  • 如何用C++判斷一個系統(tǒng)是16位、32位還是64位?

    如何用C++判斷一個系統(tǒng)是16位、32位還是64位? 方法一:使用指針的sizeof()判斷 方法二:使用整數(shù)溢出來判斷 不同系統(tǒng)的基本數(shù)據(jù)類型的字節(jié)長度區(qū)別,如下表: 平臺/類型 char short int long long long 16位 1 2 2 4 8 32位 1 2 4 4 8 64位 1 2 4 8 8 方法三:使用預(yù)定義宏來判斷

    2024年04月13日
    瀏覽(23)
  • 到底叫 集合還是數(shù)組還是list還是列表?

    1 總體上可以將數(shù)據(jù)結(jié)構(gòu)分為數(shù)組和集合兩種,而列表是一個泛指 2 數(shù)組 --?有序的,但長度是固定的-元素?cái)?shù)量固定并且需要頻繁訪問,那么使用數(shù)組可能更合適 3 集合 3.1 list? -- 支持添加和刪除元素,或者元素的數(shù)量不確定,就可以使用List類型 3.2?set --?Set是一種不允許重

    2024年02月14日
    瀏覽(20)
  • 單元測試到底是什么?應(yīng)該怎么做?

    單元測試到底是什么?應(yīng)該怎么做?

    單元測試(unit testing),是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證。至于“單元”的大小或范圍,并沒有一個明確的標(biāo)準(zhǔn),“單元”可以是一個函數(shù)、方法、類、功能模塊或者子系統(tǒng)。 單元測試通常和白盒測試聯(lián)系到一起, 如果單從概念上來講兩者是有區(qū)別的,不過

    2024年02月08日
    瀏覽(19)
  • 【一文清晰】單元測試到底是什么?應(yīng)該怎么做?

    【一文清晰】單元測試到底是什么?應(yīng)該怎么做?

    我是java程序員出身,后來因?yàn)楣ぷ髟蜣D(zhuǎn)到到了測試開發(fā)崗位。測試開發(fā)工作很多年后,現(xiàn)在是一名自由職業(yè)者 1、什么是單元測試 2、該怎么做單元測試 單元測試(unit testing),是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證。至于“單元”的大小或范圍,并沒有一個明確

    2024年02月07日
    瀏覽(15)
  • 登錄應(yīng)該是POST還是GET?

    在開發(fā)web應(yīng)用程序時,登錄模塊是經(jīng)常使用到的一個模塊。然而,對于一個登錄請求,我們應(yīng)該使用哪種HTTP方法呢?是使用POST還是GET呢?本篇文章將會給出答案。 POST和GET: 在web開發(fā)中,HTTP協(xié)議有兩種常見的請求方法:GET和POST。兩種請求方法的主要區(qū)別有以下三點(diǎn)。 1. 參

    2024年02月06日
    瀏覽(14)
  • 應(yīng)該選擇網(wǎng)絡(luò)安全還是程序員?

    很長的時間我都在思考這個問題.,根據(jù)自己的經(jīng)驗(yàn)和朋友們的討論后得出了一些結(jié)論,網(wǎng)絡(luò)安全 這個概念太廣,我就以安服/滲透崗作為比較的對象,題主可以參考一下: 程序員: 優(yōu)點(diǎn): 1.薪資非常高,今年校招大廠普遍是24K*15 2.崗位多,無論大城市還是小城市遍地是崗位

    2023年04月19日
    瀏覽(83)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包