官术网_书友最值得收藏!

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行分割前是280行,這樣算來結果還增加了21行,不過因為我們進行了分割,所以無法避免這種情況。而我們分割的目的也不是為了縮短源文件,所以總的來說還是比較滿意的。(可在6.1節確認分割的目的),真是太好了。

主站蜘蛛池模板: 新宾| 图片| 嘉祥县| 云浮市| 巴林左旗| 安泽县| 郸城县| 罗甸县| 吴江市| 双牌县| 淮南市| 东安县| 永昌县| 永泰县| 咸宁市| 土默特左旗| 乌拉特前旗| 十堰市| 木里| 隆回县| 馆陶县| 武清区| 福州市| 侯马市| 张掖市| 乐至县| 横山县| 金阳县| 东乌| 大关县| 五指山市| 株洲市| 乌兰察布市| 泾源县| 南雄市| 五台县| 景泰县| 永和县| 高青县| 临泽县| 佛教|