簡體   English   中英

.h(頭文件)和.cpp文件有什么區別?

[英]What is the difference between a .h(header file) and a .cpp file?

我正在創建一個窗口:表單應用程序。 我已經閱讀了一些答案,試圖理解.h(頭文件)和.cpp(實現文件)的概念。 當我為我的應用程序創建GUI時。 我注意到代碼放在.h文件中。 但是,當我雙擊按鈕控件以向過程添加代碼時,代碼是在.h文件而不是.cpp文件中創建的。 我是否將此代碼剪切並放入.cpp文件中,或者這是鏈接進來的地方? 過程deffintion保留在.h文件中,並將鏈接到.cpp文件中的過程代碼。

正如其他人所說,頭文件用於類,函數,類型等聲明,而.cpp文件應該包含函數的實現。 但是,編譯器並不關心編寫實現代碼的位置,因此您可以將所有代碼放在標頭本身中。 但這樣做會增加編譯時間,因為所有代碼都將編譯在包含該頭文件的每個文件中。

如果要分發代碼但需要隱藏專有代碼,那么保持實現分離非常有用。 在這種情況下,您可以從實現代碼創建庫,並將標頭與庫一起分發。

例外情況是編寫模板代碼時; 在這種情況下,實現必須進入頭部,因為編譯器需要在調用點“看到”它。

這里有兩個考慮因素。 首先,頭文件在托管代碼中並不像在本機C或C ++中那么重要。 托管代碼編譯器從程序集元數據中讀取聲明,您不會(也不應該)編寫需要在頭文件中的其他模塊中可見的C ++ / CLI類型聲明。 從元數據中獲取它們使您的類型可用於任何 .NET語言。

但真正的原因是因為表單設計器在C ++ IDE中的工作方式。 它是一個代碼生成器,由您在表單或用戶控件上放置的控件以及在“屬性”窗口中設置的屬性驅動。 如果代碼生成器需要在兩個單獨的文件中生成代碼,則存在一個非常棘手的問題。 不是生成位,而是在更改表單設計時刪除代碼。 使文件不同步會導致難以從自動生成的代碼中診斷編譯錯誤。 它比你想象的更有可能發生,代碼生成器需要處理正在編輯的源代碼文件。 非常困難,代碼可能根本無法解析。

C ++ IDE使用1.1版C#和VB.NET設計者采用的原始方法,一切都在一個文件中。 當然,這是不愉快的,聲明和代碼不應該混在一起。 通過為部分類添加對C#和VB.NET語言的支持,在2.0版本的設計器中解決了這個問題。 然而,C ++ / CLI沒有發生這種情況。 不確定原因,與其他團隊相比,C ++ / CLI團隊總是看起來資源有限。 它也沒有任何重構支持,這在類名更改時重命名方法非常重要。 保持方法內聯可以避免這個問題。

Anyhoo,您可以在.cpp文件中獲取代碼,但您必須自己完成。 剪切+粘貼完成它,但您還必須將類名稱編輯回方法聲明。 這是高維護,考慮是否值得努力。 還要考慮您是否真的想要為用戶界面使用C ++ / CLI,這是一個不尋常的選擇。

函數原型(您稱之為過程定義)應該放在頭文件中(以及宏)。 任何代碼都應該放在.cpp文件中。

如果你確定你想要移動的是代碼,它應該被移動到那里。 粘貼一些代碼會很有幫助。

標題(* .h)文件假定包含類,方法和類型的定義,而cpp文件假定具有實現細節。 在頭文件中也常常使用內聯和短方法。

編譯器不強制執行此操作,因此您可以在頭文件中編寫實現(即代碼)。

就個人而言,我正在將自動生成的代碼移動到* .cpp文件中。 在* .h文件中,我要離開的功能不會經常更改。 我這樣做是為了確保在我做出的每一次改變之后,編譯時間不會增長太多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM