C++編寫頭文件
文章轉自公眾號:Coder梁(ID:Coder_LT)
我們之前做的左右示例都是在一個單獨的cpp文件當中完成的,當我們要做一個相對復雜或大型的項目時,我們顯然不能把所有代碼都寫在一個cpp裡。這就需要我們拆分代碼,但代碼按照邏輯劃分,寫入不同的cpp文件當中。
在我們編譯的時候,我們可以將這些cpp文件分別單獨編譯,最後再連接到一起。這樣做的好處是,當我們隻修改瞭某一個文件的時候,可以隻用單獨編譯那一個文件,不會影響其他文件的編譯結果。一般來說大型項目,都會使用一下自動化的編譯工具,比如make
等,不會手動執行編譯過程,但對於這其中的一些細節,還是需要有所瞭解。
我們來看C++ primer當中提供的一個例子。
現在我們要實現一個將直接坐標轉化成極坐標的功能,我們需要定義兩個結構體分別表示直角坐標和極坐標,另外還需要實現從直接坐標到極坐標的轉化。
顯然相對於主體程序而言,這部分代碼是獨立的,所以我們可以把它們放入一個單獨的cpp文件當中。首先要明確的是,main()
函數和其他函數都用到瞭同一個結構體,因此兩個cpp文件都需要包含該結構體的聲明。顯然拷貝代碼是很糟糕的選擇,比較好的做法是將結構體的聲明寫在頭文件當中,通過#include
語句引入。
這樣的話整體的代碼就分成三個部分:
- 頭文件:包含結構體聲明、函數聲明
coordin.cpp
:包含坐標系轉化相關的代碼main.cpp
:主體程序
在之後面向對象的章節當中, 我們將會經常用到這樣的代碼結構。
對於頭文件當中的內容有嚴格的限制,由於頭文件可能會被多個cpp文件引入,所以我們不能將函數的實現或參數的定義放入頭文件當中。因為同一個程序中包含同一個函數的多個定義會引發報錯,參數同理。
隻有以下內容可以寫入頭文件當中:
- 函數原型(函數聲明)
#define
或const
定義的符號常量- 結構體聲明
- 類聲明
- 模板聲明
- 內聯函數(
inline
)
在同一個文件當中隻能引入一個頭文件一次,但有的時候由於引用依賴的原因,可能會導致重復引入。比如引入A和B頭文件,B頭文件中引入瞭A,導致A被引入兩次。
為瞭解決這個問題,我們可以加入預編譯指令#ifndef
,含義是if not defined
,判斷某定義是否存在。隻有當定義不存在時才會直接#ifndef
和#endif
之間的語句:
#ifndef COORDIN_H_ // statements #endif
一般情況下我們使用#define創建符號常量:
#define MAXI 4096
但由於這裡我們隻是用來區分是否引入,所以隻需要名稱即可:
#ifndef COORDIN_H #define COORDIN_H // todo #endif
這樣,當引入一次之後,COORDIN_H
即被定義,那麼下次就不會再執行這段代碼。
最後,我們寫出完整的頭文件代碼:
#
ifndef COORDIN_H__ #define COORDIN_H__ struct polar { double distance, angle; }; struct rect { double x, y; }; polar rect_to_polar(rect xpros); void show_polar(polar dapos); #endif
到此這篇關於C++編寫頭文件的文章就介紹到這瞭,更多相關C++編寫頭文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!