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);
}
相關文章
相關標籤/搜索