但现在看起来真不爽,main.c依赖的文件不能在工程中管理,要修改那些文件的话麻烦大了。如何既能分成多个文件又能在工程中看到呢?可以,使用头文件(h文件)。
头文件中只放那些不产生内存占用的代码,比如定义结构(定义结构不会产生内存分配,只有用结构定义变量时才产生内存分配)、定义枚举,定义宏,声明变量,声明函数等。而且大都是一个c文件对应一个h文件。下面增加poker.h和player.h(注意main.c是不需要有h文件的,因为我们应该保证main.c只依赖别的文件,而不能被别的文件依赖),下面我们就把c文件中的结构、宏、枚举的定义移到对应的h文件中,然后再将变量和函数在h文件中增加声明,于是poker.h和player.h是这样的:
poker.h:
//一副牌的数量
#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;//玩家分到的牌。每项是一个指针,指向原始一副牌数组中的一项,这样可以节省空间
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。然而不幸的是,现在又出现了一大堆错误,都是一些重定义或标志符冲突之类的错误。如何解决这些错误呢? 需使用条件编译指令!
我们看到过很多以#开头的令,比如#include、#define等。这些叫做编译指令。这些不产生实际的CPU指令,也就是说它们不是代码,但是编译器跟据它们处理代码的生成。这些编译指令还可以使用条件语句来控制编译器的动作,下面我们就为player.h增加条件编译指令来解决重定义错误。player.h变成了这样:
#ifndef PLAYER_H
#define PLAYER_H
#include "poker.h"
//定义玩家
typedef struct Player{
char name[64];//玩家的名字
Card ** cards;//玩家分到的牌。每项是一个指针,指向原始一副牌数组中的一项,这样可以节省空间
int cardsCount;//玩家分到的牌的数量
}Player;
void dispatchCards(Player** ,int ,const Card** );
#endif //PLAYER_C
上一篇:成为C++高手之提高可维护性