找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2776|回復(fù): 0
收起左側(cè)

定義自己的頭文件(C語言)

[復(fù)制鏈接]
ID:68618 發(fā)表于 2014-11-22 15:52 | 顯示全部樓層 |閱讀模式
自定義函數(shù)庫的方法及應(yīng)用:

一、2個相關(guān)的命令

1、TCC——TC的DOS下的命令行編譯連接工具
2、TLIB——TC的DOS下的庫操作工具

二、1個自定義的函數(shù)庫的例子

1、 在TC集成環(huán)境下,編一個文件USERADD.C
#define _NO_MAIN
int add(int *a,int *b)
{ int c;
c=(*a)+(*b);
return c;
}
按ALT—F9編譯 生成一個 USERADD.OBJ文件。

2、按F10—F—O 退到DOSSHELL(DOS環(huán)境下)
COPY USERADD.OBJ 到 ..\LIB目錄,在\LIB目錄下執(zhí)行
TLIB USERLIB.LIB+USERADD.OBJ 就生成了一個自己的函數(shù)庫 USERLIB,在這個函數(shù)庫里就包含了函數(shù)模塊 int add(int *a,int *b) 的二進(jìn)制代碼。現(xiàn)在已經(jīng)將自定義的函數(shù)放進(jìn)了函數(shù)庫,就可以把原文件USERADD.C刪掉不要了。(當(dāng)然,為了以后維護(hù)方便,還是作一個備份為好)。 以后如有其它的函數(shù)模塊,也可以編譯后用TLIB 命令加入到這個函數(shù)庫里。

3、寫一個包含文件 USER1.H,寫完后COPY到INCLUDE 目錄。內(nèi)容如下:
int add(int *,int *);

4、作好了以上的自定義函數(shù)庫的準(zhǔn)備工作,現(xiàn)在就可以使用了。
寫一個程序,取名為ADD-1.C,在程序中調(diào)用庫函數(shù)add( );
#include<stdio.h>
#include<user1.h>
void main( )
{
int a,b,c;
a=20;b=30;
c=add(&a,&b);
printf(“%d”,c);
}

5、在DOS命令行下,執(zhí)行 TCC ADD-1.C ..\LIB\USERLIB.LIB 就OK!
運行ADD-1.EXE,可以看到輸出結(jié)果 50
=============================================================

注:在DOS下編譯和連接是一件煩心的事情,下面講的方法就可以在TC集成環(huán)境下實現(xiàn)編譯和連接。
在上面的第二步中,TLIB命令的執(zhí)行改為 TLIB CS. LIB+USERADD.OBJ 這里是將自定義函數(shù)模塊的二進(jìn)制代碼加入到 運行時庫CS. LIB里面。(對應(yīng)不同的編譯模式,選用不同的Cx.LIB)
然后在集成環(huán)境下編譯連接 ADD-1.C 就可以了。

附注:CS.LIB 小模式庫
CC.LIB 緊湊模式庫
CM .LIB 中模式庫
CL .LIB 大模式庫
CH .LIB 巨模式庫
(以上五種為運行時庫,無論建立何種程序都要連接這些函數(shù)庫)

EMU|FP87:EMU 是浮點數(shù)模擬函數(shù)庫,而FP87則是當(dāng)我們具有80X87共處理機時所使用的浮點數(shù)函數(shù)庫。如果程序中有浮點運算就必須連接這二個函數(shù)庫之一,以及MATHx函數(shù)庫。
MATHx:數(shù)學(xué)函數(shù)庫。其中x代表s、c、m、l、h字符。

另外,TC 的哪一個庫函數(shù)的二進(jìn)制代碼放在哪一個函數(shù)庫里不得而知。但有一點可以肯定,就在這其中的庫里面。


文章2
一些初學(xué)C語言的人,不知道頭文件(*.h文件)原來還可以自己寫的。只知道調(diào)用系統(tǒng)庫 函數(shù)時,要使用#include語句將某些頭文件包含進(jìn)去。其實,頭文件跟.C文件一樣,是可以自己寫的。頭文件是一種文本文件,使用文本編輯器將代碼編寫好之后,以擴展名.h保存就行了。頭文件中一般放一些重復(fù)使用的代碼,例如函數(shù)聲明,變量聲明,常數(shù)定義,宏的定義等等。當(dāng)使用#include語句將頭文件引用時,相當(dāng)于將頭文件中所有內(nèi)容,復(fù)制到#include處。為了避免因為重復(fù)引用而導(dǎo)致的編譯錯誤,頭文件常具有
#ifndef   LABEL
#define   LABEL
   //代碼部分
#endif
的格式。其中,LABEL為一個唯一的標(biāo)號,命名規(guī)則跟變量的命名規(guī)則一樣。常根據(jù)它所在的頭文件名來命名,例如,如果頭文件的文件名叫做hardware.h,
那么可以這樣使用:
#ifndef   __HARDWARE_H__
#define   __HARDWARE_H__
  //代碼部分
#endif
這樣寫的意思就是,如果沒有定義__HARDWARE_H__,則定義__HARDWARE_H__,并編譯下面的代碼部分,直到遇到#endif。這樣,當(dāng)重復(fù)引用時,由于__HARDWARE_H__已經(jīng)被定義,則下面的代碼部分就不會被編譯了,這樣就避免了重復(fù)定義。
另外一個地方就是使用include時,使用引號與尖括號的意思是不一樣的。使用引號(“”)時,首先搜索工程文件所在目錄,然后再搜索編譯器頭文件所在目錄。而使用尖括號(<>)時,剛好是相反的搜索順序。假設(shè)我們有兩個文件名一樣的頭文件hardware.h,但內(nèi)容卻是不一樣的。一個保存在編譯器指定的頭文件目錄下,我們把它叫做文件I;另一個則保存在當(dāng)前工程的目錄下,我們把它叫做文件II。如果我們使用的是#include <hardware.h>,則我們引用到的是文件I。如果我們使用的是#include “hardware.h”,則我們引用的將是文件II。筆者以前就遇到過一個同事問,為什么他修改了那個頭文件里面的內(nèi)容,好象跟沒有修改一樣?就是因為他有兩個一樣的頭文件(就像我們剛描述的那樣),他是使用#include<hardware.h>引用的,而他修改時,卻是當(dāng)前工程所在的目錄下的那個文件                                                                                             
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表