这个实例包含以下几个文件安全
global.h //定义一些全局的变量的声明(用extern修饰),枚举,数据结构,结构体数据结构
play.h //播放音乐相关的几个函数的声明函数
play.c //函数的定义指针
main.c //主函数所在文件code
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 io
#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); }