亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么有頭文件和.cpp文件?

為什么有頭文件和.cpp文件?

C++ C
滄海一幻覺 2019-06-03 10:25:10
為什么有頭文件和.cpp文件?為什么C+有頭文件和.cpp文件?
查看完整描述

3 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

主要原因是接口與實現分離。頭文件聲明“什么”類(或任何正在實現的)將做什么,而CPP文件定義“如何”它將執行這些特性。

這減少了依賴關系,這樣使用標頭的代碼就不一定需要知道實現的所有細節,以及只需要知道實現所需的任何其他類/頭。這將減少編譯時間,以及在實現中的某些內容發生變化時所需的重新編譯量。

這并不完美,你通常會求助于一些技巧,比如PIMPL成語正確地分離接口和實現,但這是一個很好的開始。


查看完整回答
反對 回復 2019-06-03
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

C+編譯

C+編譯分為兩個主要階段:

  1. 第一種方法是將“源文件”文本文件編譯成二進制“對象”文件:CPP文件是已編譯的文件,編譯時不知道其他CPP文件(甚至庫),除非通過原始聲明或頭包含將文件提供給它。CPP文件通常被編譯成.obj或.o“Object”文件。

  2. 第二種方法是將所有“對象”文件鏈接在一起,從而創建最終的二進制文件(庫或可執行文件)。

在所有這些過程中,HPP適合哪里?

一個可憐的孤獨的CPP文件.。

每個CPP文件的編譯獨立于所有其他CPP文件,這意味著如果A.CPP需要在B.CPP中定義一個符號,例如:

// A.CPPvoid doSomething(){
   doSomethingElse(); // Defined in B.CPP}// B.CPPvoid doSomethingElse(){
   // Etc.}

它不會編譯,因為A.CPP無法知道“doSomeingElse”的存在.除非A.CPP中有聲明,例如:

// A.CPPvoid doSomethingElse() ; // From B.CPPvoid doSomething(){
   doSomethingElse() ; // Defined in B.CPP}

然后,如果有使用相同符號的C.CPP,則復制/粘貼聲明.

復制/粘貼警報!

是的,有個問題。復制/粘貼是危險的,很難維護。這意味著如果我們有辦法不復制/粘貼,并且仍然聲明符號.我們怎么做呢?包含一些文本文件,通常后綴為.h、.hxx、.h+,或者,我更喜歡C+文件.hpp:

// B.HPP (here, we decided to declare every symbol defined in B.CPP)void doSomethingElse() ;// A.CPP#include "B.HPP"void doSomething(){
   doSomethingElse() ; // Defined in B.CPP}// B.CPP#include "B.HPP"void doSomethingElse(){
   // Etc.}// C.CPP#include "B.HPP"void doSomethingAgain(){
   doSomethingElse() ; // Defined in B.CPP}

如何include工作?

本質上,包含一個文件將解析并復制將其內容粘貼到cpp文件中。

例如,在下面的代碼中,使用了A.HPP標題:

// A.HPPvoid someFunction();void someOtherFunction();

..資料來源B.CPP:

// B.CPP#include "A.HPP"void doSomething(){
   // Etc.}

..將在納入后成為:

// B.CPPvoid someFunction();void someOtherFunction();void doSomething(){
   // Etc.}

一件小事-為什么在B.CPP中包括B.HPP?

在當前情況下,這是不需要的,B.HPP具有doSomethingElse函數聲明,而B.CPP具有doSomethingElse函數定義(它本身就是一個聲明)。但在更一般的情況下,B.HPP用于聲明(和內聯代碼),可能沒有相應的定義(例如枚舉、普通結構等),因此如果B.CPP使用B.HPP的聲明,則可能需要包含。默認情況下,源包含其標題是“不錯的選擇”。

結語

因此,頭文件是必要的,因為C+編譯器無法單獨搜索符號聲明,因此,您必須通過包含這些聲明來幫助它。

最后一句話:您應該在您的HPP文件的內容周圍設置頭保護,以確保多個包含不會破壞任何東西,但總而言之,我相信HPP文件存在的主要原因已經在上面解釋過了。

#ifndef B_HPP_#define B_HPP_// The declarations in the B.hpp file#endif // B_HPP_


查看完整回答
反對 回復 2019-06-03
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

因為C是這個概念起源的地方,它有30年的歷史,而那時,它是將多個文件中的代碼鏈接在一起的唯一可行的方法。

今天,這是一個可怕的黑客,它完全破壞了C+中的編譯時間,導致了無數不必要的依賴(因為頭文件中的類定義暴露了太多關于實現的信息),依此類推。


查看完整回答
反對 回復 2019-06-03
  • 3 回答
  • 0 關注
  • 769 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號