C语言多文件编程

这个实例包含以下几个文件安全

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);
}
相关文章
相关标签/搜索