1、外部函數(shù)extern時(shí)聲明這個(gè)函數(shù)為外部函數(shù),本文件不做定義,只調(diào)用,編譯不會(huì)出錯(cuò),但不能運(yùn)行(沒有函數(shù)實(shí)體)。如果想有運(yùn)行結(jié)果就必須將函數(shù)實(shí)體包含進(jìn)來,所以文件包含和extern是配合使用的。文件包含只需要包含.h就是實(shí)體的頭文件,但有些軟件貌似不能識(shí)別頭文件和c的關(guān)系,所以就只能包含.c文件。
創(chuàng)新互聯(lián)主要為客戶提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁視覺設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、全網(wǎng)營銷推廣、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)、手機(jī)網(wǎng)站制作、微商城、網(wǎng)站托管及成都網(wǎng)站維護(hù)、WEB系統(tǒng)開發(fā)、域名注冊(cè)、國內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測(cè)試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為隧道混凝土攪拌車行業(yè)客戶提供了網(wǎng)站維護(hù)服務(wù)。
2、也就是說外部函數(shù)extern只是個(gè)聲明,他告訴編譯器我用到了一個(gè)外部函數(shù),但如果該文件沒有將函數(shù)實(shí)體包含進(jìn)來,編譯器是找不到的,依然是不能運(yùn)行的,所以extern只是個(gè)聲明,并沒有做任何事,只是這樣是沒用的。include是包含一個(gè)文件,就是類似于該文件復(fù)制到此處(只是說類似,其實(shí)是個(gè)查找路徑,讓編譯器去該路徑查找函數(shù))。
函數(shù)定義好以后,要被其它函數(shù)調(diào)用了才能被執(zhí)行。C
語言的函數(shù)是能相互調(diào)用的,
但在調(diào)用函數(shù)前,必須對(duì)函數(shù)的類型進(jìn)行說明,就算是標(biāo)準(zhǔn)庫函數(shù)也不例外。標(biāo)準(zhǔn)庫函數(shù)的
說明會(huì)被按功能分別寫在不一樣的頭文件中,使用時(shí)只要在文件最前面用#include
預(yù)處理語
句引入相應(yīng)的頭文件。如前面一直有使用的
printf
函數(shù)說明就是放在文件名為
stdio.h
的
頭文件中。調(diào)用就是指一個(gè)函數(shù)體中引用另一個(gè)已定義的函數(shù)來實(shí)現(xiàn)所需要的功能,這個(gè)時(shí)候函
數(shù)體稱為主調(diào)用函數(shù),函數(shù)體中所引用的函數(shù)稱為被調(diào)用函數(shù)。一個(gè)函數(shù)體中能調(diào)用數(shù)個(gè)
其它的函數(shù),這些被調(diào)用的函數(shù)同樣也能調(diào)用其它函數(shù),也能嵌套調(diào)用。筆者本人認(rèn)為
主函數(shù)只是相對(duì)于被調(diào)用函數(shù)而言。在
c51
語言中有一個(gè)函數(shù)是不能被其它函數(shù)所調(diào)用的,
它就是
main
主函數(shù)。調(diào)用函數(shù)的一般形式如下:
函數(shù)名
(實(shí)際參數(shù)表)
“函數(shù)名”就是指被調(diào)用的函數(shù)。實(shí)際參數(shù)表能為零或多個(gè)參數(shù),多個(gè)參數(shù)時(shí)要用逗
號(hào)隔開,每個(gè)參數(shù)的類型、位置應(yīng)與函數(shù)定義時(shí)所的形式參數(shù)一一對(duì)應(yīng),它的作用就是把參
數(shù)傳到被調(diào)用函數(shù)中的形式參數(shù),如果類型不對(duì)應(yīng)就會(huì)產(chǎn)生一些錯(cuò)誤。調(diào)用的函數(shù)是無參函
數(shù)時(shí)不寫參數(shù),但不能省后面的括號(hào)。
在以前的一些例子我們也能看不一樣的調(diào)用方式:
1.函數(shù)語句
如
printf
("Hello
World!n");
這是在
我們的第一個(gè)程序中出現(xiàn)的,它以
"Hello
World!n"為參數(shù)調(diào)用
printf
這個(gè)庫函數(shù)。在這里函數(shù)調(diào)用被看作了一條語句。
2.函數(shù)參數(shù)
“函數(shù)參數(shù)”這種方式是指被調(diào)用函數(shù)的返回值當(dāng)作另一個(gè)被調(diào)用函數(shù)的實(shí)際參
數(shù),如
temp=StrToInt(CharB(16));CharB
的返回值作為
StrToInt
函數(shù)的實(shí)際參數(shù)傳遞。
3.函數(shù)表達(dá)式
而在上一篇的例子中有
temp
=
Count();這樣一句,這個(gè)時(shí)候函數(shù)的調(diào)用作為一個(gè)運(yùn)算
對(duì)象出現(xiàn)在表達(dá)式中,能稱為函數(shù)表達(dá)式。例子中
Count()返回一個(gè)
int
類型的返回
值直接賦值給
temp。注意的是這種調(diào)用方式要求被調(diào)用的函數(shù)能返回一個(gè)同類型的值,
不然會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤。
前面說到調(diào)用函數(shù)前要對(duì)被調(diào)用的函數(shù)進(jìn)行說明。標(biāo)準(zhǔn)庫函數(shù)只要用#include
引入已
寫好說明的頭文件,在程序就能直接調(diào)用函數(shù)了。如調(diào)用的是自定義的函數(shù)則要用如下形
式編寫函數(shù)類型說明
類型標(biāo)識(shí)符
函數(shù)的名稱(形式參數(shù)表);
這樣的說明方式是用在被調(diào)函數(shù)定義和主調(diào)函數(shù)是在同一文件中。你也能把這些寫到
文件名.h
的文件中用#include
"文件名.h"引入。如果被調(diào)函數(shù)的定義和主調(diào)函數(shù)不是在同
一文件中的,則要用如下的方式進(jìn)行說明,說明被調(diào)函數(shù)的定義在同一項(xiàng)目的不一樣文件之上,
其實(shí)庫函數(shù)的頭文件也是如此說明庫函數(shù)的,如果說明的函數(shù)也能稱為外部函數(shù)。
extern
類型標(biāo)識(shí)符
函數(shù)的名稱(形式參數(shù)表);
函數(shù)的定義和說明是完全不一樣的,在編譯的角度上看函數(shù)的定義是把函數(shù)編譯存放在
ROM
的某一段地址上,而函數(shù)說明是告訴編譯器要在程序中使用那些函數(shù)并確定函數(shù)的地
址。如果在同一文件中被調(diào)函數(shù)的定義在主調(diào)函數(shù)之前,這個(gè)時(shí)候能不用說明函數(shù)類型。也就
是說在
main
函數(shù)之前定義的函數(shù),在程序中就能不用寫函數(shù)類型說明了。能在一個(gè)函
數(shù)體調(diào)用另一個(gè)函數(shù)(嵌套調(diào)用),但不允許在一個(gè)函數(shù)定義中定義另一個(gè)函數(shù)。還要注意
的是函數(shù)定義和說明中的“類型、形參表、名稱”等都要相一致。
在源文件A1.c中調(diào)用A2.c 中的函數(shù)有兩種方法:
1、在A2.c中有完整的函數(shù)定義,在A1.c中添加一下要用到的函數(shù)原型(聲明)就可以了,例如:
在A2.c中:有函數(shù)void A2(){...};。
在A1.c中:在文件前頭增加一行:void A2();就可以了。
2、把A2.c中完整定義的函數(shù)的原型,寫到一個(gè)A2.h文件中,然后在A1.c的文件頭增加#include "A2.h"就可以了。
以上兩種方法,在A1.c中都可以正常的調(diào)用,就跟在A2.c中調(diào)用一樣。
其實(shí)函數(shù)默認(rèn)是外部的,只要在其他文件中聲明就能使用;但是注意如果在前面加上static,就只能在本文件中使用了,不能再被其他的文件調(diào)用。
擴(kuò)展資料:?
1、一個(gè).h文件要 對(duì)應(yīng)有一個(gè).c文件,這樣鏈接器就可以調(diào)用這個(gè)文件里的函數(shù)。比如a.h 和 a.c。
2、把相應(yīng)的函數(shù)定義寫在.c文件中。這里要強(qiáng)調(diào)一點(diǎn):要加上#include ".h",這個(gè)一般作為一種工程規(guī)范。因?yàn)槿绻?c文件中的函數(shù)也需要調(diào)用同個(gè).c中的其它函數(shù),那么這個(gè).c往往會(huì)include對(duì)應(yīng)的.h。比如頭文件里進(jìn)行了變量的聲明,這個(gè)時(shí)候?qū)?yīng)的.c文件是一定要加上這個(gè)頭文件的。
3、再在其他的main.c文件開頭添加#include "a.h"。