EasyC++編寫頭文件
文章轉(zhuǎn)自公眾號(hào):Coder梁(ID:Coder_LT)
我們之前做的左右示例都是在一個(gè)單獨(dú)的cpp文件當(dāng)中完成的,當(dāng)我們要做一個(gè)相對(duì)復(fù)雜或大型的項(xiàng)目時(shí),我們顯然不能把所有代碼都寫在一個(gè)cpp里。這就需要我們拆分代碼,但代碼按照邏輯劃分,寫入不同的cpp文件當(dāng)中。
在我們編譯的時(shí)候,我們可以將這些cpp文件分別單獨(dú)編譯,最后再連接到一起。這樣做的好處是,當(dāng)我們只修改了某一個(gè)文件的時(shí)候,可以只用單獨(dú)編譯那一個(gè)文件,不會(huì)影響其他文件的編譯結(jié)果。一般來說大型項(xiàng)目,都會(huì)使用一下自動(dòng)化的編譯工具,比如make
等,不會(huì)手動(dòng)執(zhí)行編譯過程,但對(duì)于這其中的一些細(xì)節(jié),還是需要有所了解。
我們來看C++ primer當(dāng)中提供的一個(gè)例子。
現(xiàn)在我們要實(shí)現(xiàn)一個(gè)將直接坐標(biāo)轉(zhuǎn)化成極坐標(biāo)的功能,我們需要定義兩個(gè)結(jié)構(gòu)體分別表示直角坐標(biāo)和極坐標(biāo),另外還需要實(shí)現(xiàn)從直接坐標(biāo)到極坐標(biāo)的轉(zhuǎn)化。
顯然相對(duì)于主體程序而言,這部分代碼是獨(dú)立的,所以我們可以把它們放入一個(gè)單獨(dú)的cpp文件當(dāng)中。首先要明確的是,main()
函數(shù)和其他函數(shù)都用到了同一個(gè)結(jié)構(gòu)體,因此兩個(gè)cpp文件都需要包含該結(jié)構(gòu)體的聲明。顯然拷貝代碼是很糟糕的選擇,比較好的做法是將結(jié)構(gòu)體的聲明寫在頭文件當(dāng)中,通過#include
語句引入。
這樣的話整體的代碼就分成三個(gè)部分:
- 頭文件:包含結(jié)構(gòu)體聲明、函數(shù)聲明
coordin.cpp
:包含坐標(biāo)系轉(zhuǎn)化相關(guān)的代碼main.cpp
:主體程序
在之后面向?qū)ο蟮恼鹿?jié)當(dāng)中, 我們將會(huì)經(jīng)常用到這樣的代碼結(jié)構(gòu)。
對(duì)于頭文件當(dāng)中的內(nèi)容有嚴(yán)格的限制,由于頭文件可能會(huì)被多個(gè)cpp文件引入,所以我們不能將函數(shù)的實(shí)現(xiàn)或參數(shù)的定義放入頭文件當(dāng)中。因?yàn)橥粋€(gè)程序中包含同一個(gè)函數(shù)的多個(gè)定義會(huì)引發(fā)報(bào)錯(cuò),參數(shù)同理。
只有以下內(nèi)容可以寫入頭文件當(dāng)中:
- 函數(shù)原型(函數(shù)聲明)
#define
或const
定義的符號(hào)常量- 結(jié)構(gòu)體聲明
- 類聲明
- 模板聲明
- 內(nèi)聯(lián)函數(shù)(
inline
)
在同一個(gè)文件當(dāng)中只能引入一個(gè)頭文件一次,但有的時(shí)候由于引用依賴的原因,可能會(huì)導(dǎo)致重復(fù)引入。比如引入A和B頭文件,B頭文件中引入了A,導(dǎo)致A被引入兩次。
為了解決這個(gè)問題,我們可以加入預(yù)編譯指令#ifndef
,含義是if not defined
,判斷某定義是否存在。只有當(dāng)定義不存在時(shí)才會(huì)直接#ifndef
和#endif
之間的語句:
#ifndef COORDIN_H_ // statements #endif
一般情況下我們使用#define創(chuàng)建符號(hào)常量:
#define MAXI 4096
但由于這里我們只是用來區(qū)分是否引入,所以只需要名稱即可:
#ifndef COORDIN_H #define COORDIN_H // todo #endif
這樣,當(dāng)引入一次之后,COORDIN_H
即被定義,那么下次就不會(huì)再執(zhí)行這段代碼。
最后,我們寫出完整的頭文件代碼:
#
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
到此這篇關(guān)于C++編寫頭文件的文章就介紹到這了,更多相關(guān)C++編寫頭文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C++中new運(yùn)算符和delete運(yùn)算符的使用
這篇文章主要介紹了C++中new運(yùn)算符和delete運(yùn)算符的使用,文章來自于微軟開發(fā)者文檔,因而根據(jù)Visual C++的一些特性來進(jìn)行講解,需要的朋友可以參考下2016-01-01C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式
本文給大家分享的是本人在學(xué)習(xí)C++過程中的一個(gè)小心得,關(guān)于數(shù)據(jù)類型和轉(zhuǎn)換方式的,這里記錄下來,推薦給菜鳥們,高手大神請(qǐng)直接飄過。2015-07-07opencv?C++模板匹配的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了opencv?C++模板匹配的簡(jiǎn)單實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Qt創(chuàng)建項(xiàng)目實(shí)戰(zhàn)之手把手創(chuàng)建第一個(gè)Qt項(xiàng)目
我們?cè)谶M(jìn)行軟件開發(fā)學(xué)習(xí)時(shí),有時(shí)候需要qt軟件進(jìn)行代碼的敲寫,下面這篇文章主要給大家介紹了關(guān)于Qt創(chuàng)建項(xiàng)目實(shí)戰(zhàn)之手把手創(chuàng)建第一個(gè)Qt項(xiàng)目的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04