程序员人生 网站导航

[置顶] 成为C++高手之头文件

栏目:php教程时间:2016-06-24 16:59:32

但现在看起来真不爽,main.c依赖的文件不能在工程中管理,要修改那些文件的话麻烦大了。如何既能分成多个文件又能在工程中看到呢?可以,使用头文件(h文件)。

头文件中只放那些不产生内存占用的代码,比如定义结构(定义结构不会产生内存分配,只有用结构定义变量时才产生内存分配)、定义枚举,定义宏,声明变量,声明函数等。而且大都是1个c文件对应1个h文件。下面增加poker.h和player.h(注意main.c是不需要有h文件的,由于我们应当保证main.c只依赖别的文件,而不能被别的文件依赖),下面我们就把c文件中的结构、宏、枚举的定义移到对应的h文件中,然后再将变量和函数在h文件中增加声明,因而poker.h和player.h是这样的:

poker.h:

//1副牌的数量 #define CARD_COUNT 54 //定义扑克的花色 enum Suit{ heart, spade, diamond, club, joker1, joker2 }; //定义扑克 typedef struct Card{ int value;//牌的点数从1开始 enum Suit suit;//花色 }Card; //定义比较函数的类型 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;//玩家分到的牌。每项是1个指针,指向原始1副牌数组中的1项,这样可以节省空间 int cardsCount;//玩家分到的牌的数量 }Player; void dispatchCards(Player** ,int ,const Card** );

main.c中不再include poker.c和player.c,而是改成include 头文件。但是player.c和poker.c中也应当include各自的头文件,由于它们用到的结构、枚举等移到头文件中了,而且编译器不会自动将同名的h文件和c文件关联。其实还不够,player.h中用到了Card结构的定义,因而player.h依赖poker.h,所以应在player.h中include poker.h。但是不幸的是,现在又出现了1大堆毛病,都是1些重定义或标志符冲突之类的毛病。如何解决这些毛病呢? 需使用条件编译指令!

我们看到过很多以#开头的令,比如#include、#define等。这些叫做编译指令。这些不产生实际的CPU指令,也就是说它们不是代码,但是编译器跟据它们处理代码的生成。这些编译指令还可使用条件语句来控制编译器的动作,下面我们就为player.h增加条件编译指令来解决重定义毛病。player.h变成了这样:

#ifndef PLAYER_H #define PLAYER_H #include "poker.h" //定义玩家 typedef struct Player{ char name[64];//玩家的名字 Card ** cards;//玩家分到的牌。每项是1个指针,指向原始1副牌数组中的1项,这样可以节省空间 int cardsCount;//玩家分到的牌的数量 }Player; void dispatchCards(Player** ,int ,const Card** ); #endif //PLAYER_C

上1篇:成为C++高手之提高可保护性

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐