C語言在頭文件中實現(xiàn)函數(shù)定義,可以按如下方法:
專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)泌陽免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。
新建一個demo.h(也可以為其它文件名)的頭文件,在頭文件中添加函數(shù)定義,如:extern void demo();
新建一個c文件,在文件中將demo.h包含進來:#include“demo.h”,在此文件中將函數(shù)的主體寫上,如下:
void demo()
{
printf("Hello.");
?}
經(jīng)過上述步驟,即可完成在頭文件中實現(xiàn)函數(shù)定義。
自定義頭文件通常放在使用該頭文件的源文件所在的目錄中,并使用#include "MyHead.h"來包含。
頭文件是不編譯的,因為C語言編譯過程之前有個預編譯過程。在這個過程中用頭文件中的內容替換源文件中“#include”命令,所以在編譯器看來,沒有頭文件,只有源文件。預編譯過程還包括條件編譯。
頭文件為了防止被重復包含,通常的格式是:
/* MyHead.h */
#ifndef _MYHEAD_H_
#define _MYHEAD_H_
(這里是頭文件的內容)
#endif /* _MYHEAD_H_ */
拓展資料
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規(guī)格寫出的C語言程序可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業(yè)平臺。
額,書上都有吧。
一般來說,頭文件(.h)都包含了一些常用的而且已經(jīng)通過了測試證明其運行正確的函數(shù),
在自己的程序中用#include引用這些頭文件,直接使用其中一些已經(jīng)寫好的函數(shù),就省去
了很多麻煩,提高了代碼的重用性。例如我們常常在程序中寫下 #include stdio.h 語
句,以使用頭文件 stdio.h 中的函數(shù),比如說printf函數(shù)。可是該如何寫自己的頭文件,
以讓自己的函數(shù)能被再次使用呢?
也許有同學會想,真接把自己的函數(shù)聲明與定義移到.h文件里就可以了。就如下面的做法:
在工程里建好main.c后,再建一個點utils.h文件,把常用的函數(shù)如mean()放這里。
// file name : utils.h
// version : 1
doublemean(double, double); //求兩個數(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); //調用utils.h里的mean函數(shù)
printf("%lf\n", avg);
return0;
}
以上的代碼是可以編譯通過的,并運行正確的。但是,這樣的代碼并不完善。如果
再寫一個頭文件other.h,而other.h又引用了utils.h的mean()函數(shù),這時就會出
問題:
// file name : utils.h
// version : 1
doublemean(double, double); //求兩個數(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)); // 調用了 utils.h 里的 mean 函數(shù)
}
// file name : main.c
// version : 2
// 增加了對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); //調用utils.h里的mean函數(shù)
printf("%lf\n", avg);
avg = mean4(a,b,c,d); //調用other.h里的mean4函數(shù)
printf("%lf\n", avg);
return0;
}
而此時,編譯就不能通過了,并出現(xiàn)如下的錯誤信息:
utils.h:9: Error: 'mean'is already defined
究其原因就是,函數(shù)的聲明可以在程序中寫多次,但函數(shù)定義只能有一個。main.c引用了
utils.h文件,因此main.c里會有一個mean()函數(shù)的聲明,而other.h里也引用了utils.h
文件,所以又有一個mean()函數(shù)的聲明。
main.c -- utils.h 第一個mean()
-- other.h -- utils.h 第二個mean()
歷史原因,C/C++編譯器不能將這樣相同的重復聲明區(qū)別開,所以必須通過其它的方法使得工程
里,mean()只被聲明一次。一般來說,都是通過#ifndef/#define/#endif宏命令組合來實現(xiàn)避免
重復聲明的。修改后的代碼如下:
//file name : utils.h
//version 2
#ifndef UTILS_H_INCLUDED // 如果沒有定義標識符
// UTILS_H_INCLUDED,則
// 繼續(xù)編譯下面的代碼,
// 直到 #endif
#define UTILS_H_INCLUDED // 定義標識符 UTILS_H_INCLUDED
doublemean(double, double);
doublemean(double a, double b)
{
return (a+b)/2.0;
}
#endif// UTILS_H_INCLUDED
其它代碼都同前。#ifndef/#endif 就像 if(!(...)) {} 一樣,讓編譯器明白,如果沒有定義標
識符UTILS_H_INCLUDED,就包含下面的代碼,直到#endif;否則,到#endif為止的代碼就不被包
含到文件里。#define表示定義一個標識符(不一定要賦值給這個標識符)。
當main.c引用utils.h時,由于UTILS_H_INCLUDED沒被定義,所以#ifndef與#endif之間的代碼都
會被main.c包含,所以 #define 語句會被執(zhí)行,定義一個UTILS_H_INCLUDED標識符,同時工程里
也有了一個mean()函數(shù)的定義;當main.c引用other.h時,other.h里對utils.h的引用并不會再次
定義mean(),因為UTILS_H_INCLUDED已經(jīng)被定義了,通過#ifndef/#endif的控制作用,雖然other.h
引用了utils.h,但引用的頭文件并沒有包含mean()的聲明,自然就不會再引起重復定義的錯誤,
編譯就能通過了。
基于相同的道理,所有的.h文件,都應該加入#ifndef/#define/#endif的組合,以使頭文件都能
重復利用而不引起重復定義的錯誤。例子中的other.h文件也應如此,這里就留給同學自己添加了。
參考網(wǎng)址: