游戏开发工具

一个比较规范的C语言多文件编程的例子

首先建立一个C语言项目,然后把所以创立的各个C语言文件都放在同一目录下

1.png

然后在main函数里面怎么使用其他C语言文件

2.png

main函数使用到那几个C语言文件,头文件就要写明引用的C语言文件名对应的.h,(例:exp1.c 对应ecp1.h)如上图

在main函数里面使用其他C语言文件的格式,例如 Exp1() 就是引用的exp1.c语言文件的函数名

1.jpg

ecp1.c 文件对应的ecp1.h怎么写,首先 exp1.c 里面有几个函数

则将这几个函数的函数名对应着写在 ecp1.h 中,形成 ecp1.h 文件

1.jpg

在ecp1.c 中,是 Ecp1() 函数调用剩下的其他函数,如 trans(),water(),grades() 等函数

1.png

类似写出 exp2.c,exp2.h 等等

1、简单来说,就是main函数要引用其他C语言文件,首先在头文件写出 #include "  "的格式,

即引用的C语言文件对应的 .h 文件,例如:#include "exp1.h",exp1.h 就是 exp1.c 对应的 .h 文件

2、然后在main函数里面怎么调用呢,直接使用引用的C语言文件的函数名,

如:函数名(); 的格式,例如:Exp1();   Exp1()就是 ecp1.c 文件的函数名

3、引用的C语言文件对应的 .h 文件怎么建立,例如exp1.c 对应的 .h 文件 exp1.h,

首先看 exp1.c 里面有几个函数,则将 ecp1.c 文件里面对应的所有函数写到 exp1.h,

例如 exp1.c的 Exp1(); 对应写到 exp1.h 就是 int Exp1();


例子:

global.h  //定义一些全局的变量的声明(用extern修饰),枚举,数据结构,结构体

play.h  //播放音乐相关的几个函数的声明

play.c  //函数的定义

main.c  //主函数所在文件

global.h

#ifndef _MUSIC_GLOBAL_H_
#define _MUSIC_GLOBAL_H_
#include <stdio.h>
#include <stdlib.h>
enum PlayStatus{ PLAYING, PAUSED, STOPED };
typedef struct
{
    //  char* path;
    //  char* name;
    //  char* singer;
    //char* 需要动态malloc分配内存,太麻烦
    char path[100];
    char name[50];
    char singer[50];
    long duration;
    enum PlayStatus status;
    //这里也可以定义函数指针变量
} SongInfo;
extern  SongInfo playingSong;
#endif /* _MUSIC_GLOBAL_H_ */

play.h   注意函数指针参数的使用

#ifndef _PLAY_H_
#define _PLAY_H_
#include "music.h"
/**
 * 因为在play函数内部要修改SongInfo的播放状态字段,所以这个地方参数是指针变量
 *
 * 函数内部修改传入的 普通变量的值 和 指针变量的引用的值 使用一级指针就可以(SongInfo* info)
 *
 * 但是函数内部想修改指针变量的指向,那么就需要使用二级指针 SongInfo** info)
 */
void play(SongInfo* info); //默认就是extern
void stop(SongInfo* info);//默认就是extern
void next(SongInfo** info); //
#endif

play.c   

#include "play.h"
void  play(SongInfo* info)
{
    info->status = PLAYING;
    printf("play2...");
}
void stop(SongInfo* info)
{
    info->status = STOPED;
}

main.c

#include "global.h"
#include "play.h"
/*
 gcc $(pkg-config gtk+-3.0 --cflags) $(pkg-config gtk+-3.0 --libs) main.c play.c -o gtktest
 如何包含其他动态链接库:
 如果.h文件和.c文件不在一起,那么需要通过 -I指定头文件路径
 so文件通过    “ -L so所在文件夹  -llibxxx.so ”  来指定。
 Linux 下的库文件在命名时有一个约定,那就是应该以lib 三个字母开头,由于所有的库文件都遵循了
 同样的规范,因此在用-l 选项指定链接的库文件名时可以省去lib 三个字母。
 */
 
//定义playingSong
//不需要SongInfo* p_info = (SongInfo *)malloc(sizeof(SongInfo)) 在堆上分配
//全局变量让编译器在栈上分配更加安全
//在函数内部还是需要通过malloc分配,否则将在栈上初始化,函数出栈以后内存可能被侵占
SongInfo playingSong;
int main(int argc, char *argv[])
{
    //传入指针
    play(&playingSong);
}