單片機(jī)C語言教程:C51函數(shù)
其實(shí)一直出現(xiàn)在例子中的 main()也算是一個(gè)函數(shù),只不過它比較特殊,編譯時(shí)以它做為程序的開始段。有了函數(shù)C 語言就有了模塊化的優(yōu)點(diǎn),一般功能較多的程序,會(huì)在編寫程序時(shí)把每項(xiàng)單獨(dú)的功能分成數(shù)個(gè)子程序模塊,每個(gè)子 程序就能用函數(shù)來實(shí)現(xiàn)。函數(shù)還能被反復(fù)的調(diào)用,因此一些常用的函數(shù)能做成函數(shù)庫(kù)以供在編寫程序時(shí)直接調(diào)用,從而更好的實(shí)現(xiàn)模塊化的設(shè)計(jì),大大提高編程工作的效率。
本文引用地址:http://www.ex-cimer.com/article/170574.htm一.函數(shù)定義
通常 C 語言的編譯器會(huì)自帶標(biāo)準(zhǔn)的函數(shù)庫(kù),這些都是一些常用的函數(shù),Keil uv 中也不 例外。標(biāo)準(zhǔn)函數(shù)已由編譯器軟件商編寫定義,使用者直接調(diào)用就能了,而無需定義。但是 標(biāo)準(zhǔn)的函數(shù)不足以滿足使用者的特殊要求,因此 C 語言允許使用者根據(jù)需要編寫特定功能的 函數(shù),要調(diào)用它必須要先對(duì)其進(jìn)行定義。定義的模式如下:
函數(shù)類型 函數(shù)名稱(形式參數(shù)表)
{
函數(shù)體
}
函數(shù)類型是說明所定義函數(shù)返回值的類型。返回值其實(shí)就是一個(gè)變量,只要按變量
類型來定義函數(shù)類型就行了。如函數(shù)不需要返回值函數(shù)類型能寫作“void”表示該函數(shù)沒 有返回值。注意的是函數(shù)體返回值的類型一定要和函數(shù)類型一致,不然會(huì)造成錯(cuò)誤。函數(shù)名 稱的定義在遵循 C 語言變量命名規(guī)則的同時(shí),不能在同一程序中定義同名的函數(shù)這將會(huì)造成 編譯錯(cuò)誤(同一程序中是允許有同名變量的,因?yàn)樽兞坑腥趾途植孔兞恐?。形式參數(shù) 是指調(diào)用函數(shù)時(shí)要傳入到函數(shù)體內(nèi)參與運(yùn)算的變量,它能有一個(gè)、幾個(gè)或沒有,當(dāng)不需要 形式參數(shù)也就是無參函數(shù),括號(hào)內(nèi)能為空或?qū)懭?ldquo;void”表示,但括號(hào)不能少。函數(shù)體中 能包含有局部變量的定義和程序語句,如函數(shù)要返回運(yùn)算值則要使用 return 語句進(jìn)行返 回。在函數(shù)的{}號(hào)中也能什么也不寫,這就成了空函數(shù),在一個(gè)程序項(xiàng)目中能寫一些 空函數(shù),在以后的修改和升級(jí)中能方便的在這些空函數(shù)中進(jìn)行功能擴(kuò)充。
二.函數(shù)的調(diào)用
函數(shù)定義好以后,要被其它函數(shù)調(diào)用了才能被執(zhí)行。C 語言的函數(shù)是能相互調(diào)用的, 但在調(diào)用函數(shù)前,必須對(duì)函數(shù)的類型進(jìn)行說明,就算是標(biāo)準(zhǔn)庫(kù)函數(shù)也不例外。標(biāo)準(zhǔn)庫(kù)函數(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è)庫(kù)函數(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)庫(kù)函數(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í)庫(kù)函數(shù)的頭文件也是如此說明庫(kù)函數(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ù)定義和說明中的“類型、形參表、名稱”等都要相一致。
評(píng)論