這個實例包含以下幾個文件安全
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); }