但現(xiàn)在看起來(lái)真不爽,main.c依賴的文件不能在工程中管理,要修改那些文件的話麻煩大了。如何既能分成多個(gè)文件又能在工程中看到呢?可以,使用頭文件(h文件)。
頭文件中只放那些不產(chǎn)生內(nèi)存占用的代碼,比如定義結(jié)構(gòu)(定義結(jié)構(gòu)不會(huì)產(chǎn)生內(nèi)存分配,只有用結(jié)構(gòu)定義變量時(shí)才產(chǎn)生內(nèi)存分配)、定義枚舉,定義宏,聲明變量,聲明函數(shù)等。而且大都是1個(gè)c文件對(duì)應(yīng)1個(gè)h文件。下面增加poker.h和player.h(注意main.c是不需要有h文件的,由于我們應(yīng)當(dāng)保證main.c只依賴別的文件,而不能被別的文件依賴),下面我們就把c文件中的結(jié)構(gòu)、宏、枚舉的定義移到對(duì)應(yīng)的h文件中,然后再將變量和函數(shù)在h文件中增加聲明,因而poker.h和player.h是這樣的:
poker.h:
//1副牌的數(shù)量
#define CARD_COUNT 54
//定義撲克的花色
enum Suit{
heart,
spade,
diamond,
club,
joker1,
joker2
};
//定義撲克
typedef struct Card{
int value;//牌的點(diǎn)數(shù)從1開始
enum Suit suit;//花色
}Card;
//定義比較函數(shù)的類型
typedef int (*COMPARE)(Card* ,Card*);
extern Card pokers[CARD_COUNT];
void initOnePack();
char* getCardName(const Card*);
Card** shuffle(const Card*);
void sort(Card**,int,COMPARE);
int compare1(Card* ,Card*);
int compare2(Card* ,Card*);
player.h:
//定義玩家
typedef struct Player{
char name[64];//玩家的名字
Card ** cards;//玩家分到的牌。每項(xiàng)是1個(gè)指針,指向原始1副牌數(shù)組中的1項(xiàng),這樣可以節(jié)省空間
int cardsCount;//玩家分到的牌的數(shù)量
}Player;
void dispatchCards(Player** ,int ,const Card** );
main.c中不再include poker.c和player.c,而是改成include 頭文件。但是player.c和poker.c中也應(yīng)當(dāng)include各自的頭文件,由于它們用到的結(jié)構(gòu)、枚舉等移到頭文件中了,而且編譯器不會(huì)自動(dòng)將同名的h文件和c文件關(guān)聯(lián)。其實(shí)還不夠,player.h中用到了Card結(jié)構(gòu)的定義,因而player.h依賴poker.h,所以應(yīng)在player.h中include poker.h。但是不幸的是,現(xiàn)在又出現(xiàn)了1大堆毛病,都是1些重定義或標(biāo)志符沖突之類的毛病。如何解決這些毛病呢? 需使用條件編譯指令!
我們看到過(guò)很多以#開頭的令,比如#include、#define等。這些叫做編譯指令。這些不產(chǎn)生實(shí)際的CPU指令,也就是說(shuō)它們不是代碼,但是編譯器跟據(jù)它們處理代碼的生成。這些編譯指令還可使用條件語(yǔ)句來(lái)控制編譯器的動(dòng)作,下面我們就為player.h增加條件編譯指令來(lái)解決重定義毛病。player.h變成了這樣:
#ifndef PLAYER_H
#define PLAYER_H
#include "poker.h"
//定義玩家
typedef struct Player{
char name[64];//玩家的名字
Card ** cards;//玩家分到的牌。每項(xiàng)是1個(gè)指針,指向原始1副牌數(shù)組中的1項(xiàng),這樣可以節(jié)省空間
int cardsCount;//玩家分到的牌的數(shù)量
}Player;
void dispatchCards(Player** ,int ,const Card** );
#endif //PLAYER_C
上1篇:成為C++高手之提高可保護(hù)性