3 整理頭文件(harib03c)
Makefile變短了,真讓人高興。我們繼續把源文件也整理一下。現在的文件大小如下。
graphic.c ….............. 187行
dsctbl.c …................ 67行
bootpack.c …............ 81行
合計 …...........….... 335行
這比分割前的280行多了不少。主要原因在于各個源文件都要重復聲明“vold io_out8(int port, int data); ”等,雖然說這也是迫不得已,但還是不甘心。所以,我們在這兒再下點工夫。
■■■■■
首先將重復部分全部去掉,把他們歸納起來,放到名為bootpack.h的文件里。雖然擴展名變了,但它也是C語言的文件。已經有一個文件名叫bootpack.c了,我們根據一般的做法,將文件命名為bootpack.h。因為是第一次接觸到.h文件,所以我們截取bootpack.h內容靠前的一段放在下面。
bootpack.h的內容
/* asmhead.nas */ struct BOOTINFO { /* 0x0ff0-0x0fff */ char cyls; /* 啟動區讀硬盤讀到何處為止 */ char leds; /* 啟動時鍵盤LED的狀態 */ char vmode; /* 顯卡模式為多少位彩色 */ char reserve; short scrnx, scrny; /* 畫面分辨率 */ char *vram; }; #define ADR_BOOTINFO 0x00000ff0 /* naskfunc.nas */ void io_hlt(void); void io_cli(void); void io_out8(int port, int data); int io_load_eflags(void); void io_store_eflags(int eflags); void load_gdtr(int limit, int addr); void load_idtr(int limit, int addr); /* graphic.c */ void init_palette(void); void set_palette(int start, int end, unsigned char *rgb); void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1); void init_screen8(char *vram, int x, int y); (以下略)
這個文件里不僅僅羅列出了函數的定義,還在注釋中寫明了函數的定義在哪一個源文件里。想要看一看或者修改函數定義時,只要看一下文件bootpack.h就能知道該函數定義本身在哪個源文件里。這就像目錄一樣,很方便。
在編譯graphic.c的時候,我們要讓編譯器去讀這個頭文件,做法是在graphic.c的前面加上如下一行:
#include "bootpack.h"
編譯器見到了這一行,就將該行替換成所指定文件的內容,然后進行編譯。所以,寫在“bootpack.h”里的所有內容,也都間接地寫到了“graphic.c”中。同樣道理,在“dsctbl.c”和“bootpack.c”的前面也都加上一行“#include "bootpack.h"”。
■■■■■
像這樣,僅由函數聲明和#define等組成的文件,我們稱之為頭文件。頭文件英文為header,顧名思義,是指放在程序頭部的文件。為什么要放在頭部呢?因為像“void io_out8(int port, int data); ”這種聲明必須在一開始就讓編譯器知道。
前面曾經提到,要使用spintf函數,必須在程序的前面寫上#include <stdio.h>語句。這正是因為stdio.h中含有對sprintf函數的聲明。雖然括住文件名的記號有引號和尖括號的區別,但那也只是文件所處位置的不同而已。雙引號("")表示該頭文件與源文件位于同一個文件夾里,而尖括號(< >)則表示該頭文件位于編譯器所提供的文件夾里。
這次用了很多#define語句,把用到的地址都只寫在了bootpack.h文件里。之所以這么做是因為,如果以后想要變更地址的話,只修改bootpack.h一個文件就行了。
好了,我們運行一下每次必做的“make run”確認一下。挺好挺好,運行結果沒有問題。現在再來確認一下源文件的長度。
bootpack.h ….............. 69行
graphic.c …............. 156行
dsctbl.c …................. 51行
bootpack.c …............. 25行
合計 ......................... 301行
整體共縮短了34行,真是太好了。