C 語言初學教材 - 第六章 設計自己的標頭檔

我們已經陸陸續續發展許多不同功能的程式,包括有關登入程式、帳號管理、通訊錄資料等的相關處理,有些已經寫成可以直接應用的函數,現在是時候把這三個程式模組整合在一起了。整合的方式,說來也簡單,我們自己設計自己的標頭檔,把引入標準函數庫常數定義、結構定義、函數原型的宣告都放在標頭檔之中。



所謂的標頭檔也就是另一個 .h 的檔案,以下為標頭檔的內容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define SIZE 100
#define LEN 20

#define NAME_SIZE 15

enum state {EXIT, RUN, WRONG_NAME, WRONG_CODE, Y, N};

// 自訂的時間格式
struct my_tm {
    int year;
    int month;
    int day;
    int hour;
    int isam;
    int hourt;
    int min;
    int sec;
};

// 記錄好友資料的結構
struct friendData {
    char name[NAME_SIZE];
    int age;
    int sex;
    int relation;
};

// 暫存在記憶體中的資料結構:鏈結串列
struct linkedListNode {
    struct friendData data;
    struct linkedListNode *nextPtr;
};

typedef struct my_tm My_Time;
typedef struct linkedListNode LinkedListNode;

// 登入程式模組的函數原型
void login(void);
My_Time myTimeS(time_t seconds);
void sayHello(My_Time *tPtr, char *name);

// 管理帳號模組的函數原型
int manage(int counter, char id[][LEN], char code[][LEN]);
void printList(char id[][LEN], char code[][LEN]);
void si(char id[][LEN], char code[][LEN]);
int ssearch(char array[][LEN], int size, char *target);
int di(int counter, char id[][LEN], char code[][LEN]);
int so(char id[][LEN], char code[][LEN]);
void ssort(char array[][LEN], char code[][LEN], int size);

// 通訊錄模組的函數原型
void frienddata(char *name);
int prompt(void);
void addfriend(LinkedListNode **startPtr);
void printList2(LinkedListNode *currentPtr);

/* 《程式語言:教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:itm.h
    功能:整合程式模組的標頭檔  
    作者:張凱慶
    時間:西元2010年7月 */


我們把登入程式的部份移出函數 main() ,另寫一個 login() 處理登入事項, myTimeS() 轉換時間格式, sayHello() 印出現在時間,也向使用者說哈囉。


若是使用者以管理員帳號登入,在 login() 裡呼叫 manage() 進行管理帳號的工作,這裡相關的函數我們都已經看過。


若是使用者以註冊的帳號成功登入,也就是帳號與密碼相符, login() 便呼叫 frienddata() 進行通訊錄資料的處理,這裡另有 prompt() 專門印出提示訊息,然後回傳使用者的選項。


函數定義放在實作檔中,我們也需要另一個含有 main() 的執行檔,請繼續參考


問題與討論
  1. 有哪些東西放在標頭檔裡頭?
  2. 又有哪些東西放在實作檔當中?




1 則留言:

Unknown 提到...

您好,請問為什麼標頭檔內只放入函數的原型宣告,而不將函數本身也放進去呢?