額,書上都有吧。
成都創(chuàng)新互聯(lián)是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營銷人員及形象策劃。承接:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、網(wǎng)頁設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫開發(fā),以高性價(jià)比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺(tái)等全方位的服務(wù)。
一般來說,頭文件(.h)都包含了一些常用的而且已經(jīng)通過了測試證明其運(yùn)行正確的函數(shù),
在自己的程序中用#include引用這些頭文件,直接使用其中一些已經(jīng)寫好的函數(shù),就省去
了很多麻煩,提高了代碼的重用性。例如我們常常在程序中寫下 #include stdio.h 語
句,以使用頭文件 stdio.h 中的函數(shù),比如說printf函數(shù)。可是該如何寫自己的頭文件,
以讓自己的函數(shù)能被再次使用呢?
也許有同學(xué)會(huì)想,真接把自己的函數(shù)聲明與定義移到.h文件里就可以了。就如下面的做法:
在工程里建好main.c后,再建一個(gè)點(diǎn)utils.h文件,把常用的函數(shù)如mean()放這里。
// file name : utils.h
// version : 1
doublemean(double, double); //求兩個(gè)數(shù)的均值
doublemean(double a, double b)
{
return (a+b)/2.0;
}
// file name : main.c
// version : 1
#includestdio.h
#include"utils.h"
intmain()
{
double a,b,avg;
a = 1.0;
b = 3.0;
avg = mean(a,b); //調(diào)用utils.h里的mean函數(shù)
printf("%lf\n", avg);
return0;
}
以上的代碼是可以編譯通過的,并運(yùn)行正確的。但是,這樣的代碼并不完善。如果
再寫一個(gè)頭文件other.h,而other.h又引用了utils.h的mean()函數(shù),這時(shí)就會(huì)出
問題:
// file name : utils.h
// version : 1
doublemean(double, double); //求兩個(gè)數(shù)的均值
doublemean(double a, double b)
{
return (a+b)/2.0;
}
// file name : other.h
// version : 1
#include"utils.h" //引用 utils.h
doublemean4(double, double, double, double);
doublemean4(double a, double b, double c, double d)
{
returnmean(mean(a,b), mean(c,d)); // 調(diào)用了 utils.h 里的 mean 函數(shù)
}
// file name : main.c
// version : 2
// 增加了對(duì)other.h的引用
#includestdio.h
#include"utils.h"
#include"other.h"
intmain()
{
double a,b,c,d,avg;
a = 1.0;
b = 3.0;
c = 4.0;
d = 2.0;
avg = mean(a,b); //調(diào)用utils.h里的mean函數(shù)
printf("%lf\n", avg);
avg = mean4(a,b,c,d); //調(diào)用other.h里的mean4函數(shù)
printf("%lf\n", avg);
return0;
}
而此時(shí),編譯就不能通過了,并出現(xiàn)如下的錯(cuò)誤信息:
utils.h:9: Error: 'mean'is already defined
究其原因就是,函數(shù)的聲明可以在程序中寫多次,但函數(shù)定義只能有一個(gè)。main.c引用了
utils.h文件,因此main.c里會(huì)有一個(gè)mean()函數(shù)的聲明,而other.h里也引用了utils.h
文件,所以又有一個(gè)mean()函數(shù)的聲明。
main.c -- utils.h 第一個(gè)mean()
-- other.h -- utils.h 第二個(gè)mean()
歷史原因,C/C++編譯器不能將這樣相同的重復(fù)聲明區(qū)別開,所以必須通過其它的方法使得工程
里,mean()只被聲明一次。一般來說,都是通過#ifndef/#define/#endif宏命令組合來實(shí)現(xiàn)避免
重復(fù)聲明的。修改后的代碼如下:
//file name : utils.h
//version 2
#ifndef UTILS_H_INCLUDED // 如果沒有定義標(biāo)識(shí)符
// UTILS_H_INCLUDED,則
// 繼續(xù)編譯下面的代碼,
// 直到 #endif
#define UTILS_H_INCLUDED // 定義標(biāo)識(shí)符 UTILS_H_INCLUDED
doublemean(double, double);
doublemean(double a, double b)
{
return (a+b)/2.0;
}
#endif// UTILS_H_INCLUDED
其它代碼都同前。#ifndef/#endif 就像 if(!(...)) {} 一樣,讓編譯器明白,如果沒有定義標(biāo)
識(shí)符UTILS_H_INCLUDED,就包含下面的代碼,直到#endif;否則,到#endif為止的代碼就不被包
含到文件里。#define表示定義一個(gè)標(biāo)識(shí)符(不一定要賦值給這個(gè)標(biāo)識(shí)符)。
當(dāng)main.c引用utils.h時(shí),由于UTILS_H_INCLUDED沒被定義,所以#ifndef與#endif之間的代碼都
會(huì)被main.c包含,所以 #define 語句會(huì)被執(zhí)行,定義一個(gè)UTILS_H_INCLUDED標(biāo)識(shí)符,同時(shí)工程里
也有了一個(gè)mean()函數(shù)的定義;當(dāng)main.c引用other.h時(shí),other.h里對(duì)utils.h的引用并不會(huì)再次
定義mean(),因?yàn)閁TILS_H_INCLUDED已經(jīng)被定義了,通過#ifndef/#endif的控制作用,雖然other.h
引用了utils.h,但引用的頭文件并沒有包含mean()的聲明,自然就不會(huì)再引起重復(fù)定義的錯(cuò)誤,
編譯就能通過了。
基于相同的道理,所有的.h文件,都應(yīng)該加入#ifndef/#define/#endif的組合,以使頭文件都能
重復(fù)利用而不引起重復(fù)定義的錯(cuò)誤。例子中的other.h文件也應(yīng)如此,這里就留給同學(xué)自己添加了。
參考網(wǎng)址:
一個(gè).h文件要
對(duì)應(yīng)有一個(gè).c文件,這樣寫助于查看和修改程序。比如a.h
和
a.c;:
在.h文件中
#ifndef
__A_H_
#define
__A_H_
#include
void
trans2(double
B)
;
double
trans1()
;
#endif
在.c文件中
#include
"a.h"
把相應(yīng)的函數(shù)定義寫在.c文件中
再在main.c文件中
#include
"a.h"
#include
main()
{
double
trans1()
//由度分秒到弧度
{
double
B1,B11,B12,B13,B111;
scanf("%lf°%lf′%lf″",B11,B12,B13);
B111=fabs(B11);
//B11可能為負(fù)值
B1=B111+B12/60.0+B13/3600.0;
B1=B1*atan(1)/45.0;
if(B110)
B1=-B1;
return
B1;
}
void
trans2(double
B)
//由弧度到度分秒并輸出角度值
{
int
a,b;
double
B0;
B0=fabs(B);
//B可能為負(fù)值
double
c;
B0=B0*45.0/atan(1);
a=int(B0);
b=int((B0-a)*60);
c=(B0-a)*3600-b*60;
if((int)(c)==60)
//為了避免出現(xiàn)59′60″這種情況,不過好像不起作用,不知道為什么,原來是int沒有加括號(hào)
{
b=b+1;
c=0.0;
}
if(b==60)
{
b=0;
a=a+1;
}
if(B0)
a=-a;
printf("%d°%d′%.4f″\n",a,b,c);
}
}
就可以在main.c函數(shù)中調(diào)用a.c中的函數(shù)了
首先建頭文件是為了聲明c文件中的函數(shù),以及包括宏定義。建立頭文件要有對(duì)應(yīng)的c文件。我簡單地謝了一個(gè)c文件,里面有一個(gè)函數(shù)。
下面要寫頭文件首先要建一個(gè).h文件
打開h文件,進(jìn)行編輯。建立頭文件是有一定步驟的。要用到#ifndef。。。#define。。。。#endif。這是為了避免重復(fù)定義
#ifndef后面要寫的是頭文件名稱的大寫。例如:test.h要寫成__TEST_H__。前面與后面是兩個(gè)下劃線。字母用大寫
然后在define與endif中間聲明你的函數(shù)名,記得寫冒號(hào)呦。
然后在main文件中寫上include這個(gè)頭文件,就可以調(diào)用了。
然后編譯,運(yùn)行,就OK了。祝大家學(xué)習(xí)愉快。