但现在看起来真不爽,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++高手之提高可保护性