1、在調(diào)用的函數(shù)前定義函數(shù),此時(shí)可以不需要聲明。
創(chuàng)新互聯(lián)建站主營(yíng)漣水網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP軟件開(kāi)發(fā),漣水h5重慶小程序開(kāi)發(fā)搭建,漣水網(wǎng)站營(yíng)銷推廣歡迎漣水等地區(qū)企業(yè)咨詢
2、在調(diào)用的函數(shù)前聲明。
3、在調(diào)用的函數(shù)里面也可以聲明。
4、在其他文件的頭文件*.h文件里面聲明,然后*.c文件直接調(diào)用頭文件也可以。
5、如果你把子函數(shù)放到MAIN函數(shù)外,則必須在定義的時(shí)候先聲明。
6、如果把 子函數(shù)放在MAIN函數(shù)中就不需要提前聲明了。
C語(yǔ)言中一個(gè)函數(shù)(function)是一個(gè)可以從程序其它地方調(diào)用執(zhí)行的語(yǔ)句塊。
1、通過(guò)使用函數(shù)(functions)我們可以把我們的程序以更模塊化的形式組織起來(lái),從而利用C語(yǔ)言所支持的結(jié)構(gòu)化程序設(shè)計(jì)。
2、從數(shù)學(xué)角度,函數(shù)即集合A和集合B之間的映射關(guān)系。實(shí)際上計(jì)算機(jī)中的函數(shù)概念也是源于此,因此,一般函數(shù),都有形參和返回值。
3、從計(jì)算機(jī)組成原理的角度來(lái)看,函數(shù)即是一個(gè)小型的計(jì)算機(jī)系統(tǒng),依據(jù)馮諾伊曼的“存儲(chǔ)程序原理”,每一個(gè)計(jì)算機(jī)系統(tǒng)包含:輸入系統(tǒng)、輸出系統(tǒng)、運(yùn)算器以及控制器,實(shí)際上對(duì)于C語(yǔ)言中的函數(shù)來(lái)說(shuō),它是“存儲(chǔ)程序原理”的軟實(shí)現(xiàn),其中形參、實(shí)參這是輸入系統(tǒng),返回值是輸出系統(tǒng),函數(shù)體中的運(yùn)算符,比如+、-、*、/四則運(yùn)算即為運(yùn)算器,而邏輯運(yùn)算符以及if、while等控制語(yǔ)句便是一個(gè)控制器。
函數(shù),是編程語(yǔ)言中可以獨(dú)立運(yùn)行的一個(gè)代碼塊。
在C語(yǔ)言中,程序從main()函數(shù)開(kāi)始運(yùn)行,其他函數(shù)要被main函數(shù)調(diào)用才可以運(yùn)行。
在從shell解釋器運(yùn)行編譯好的可執(zhí)行程序時(shí),main函數(shù)會(huì)被shell啟動(dòng),開(kāi)始運(yùn)行。
C語(yǔ)言的函數(shù)在使用時(shí)要經(jīng)過(guò)3個(gè)步驟:聲明、定義、調(diào)用。
函數(shù)聲明,就是給出函數(shù)的原型,讓程序員知道怎么給函數(shù)傳參數(shù),怎么接收返回值,讓編譯器知道怎么進(jìn)行代碼的類型檢查。main函數(shù)的聲明是這樣的:
int main();
它的返回值是int類型,不需要傳參數(shù)。
printf()函數(shù)的聲明是這樣的:int printf(const char* fmt, ...);
它的返回值是int類型,第一個(gè)參數(shù)是格式字符串,之后可以跟可變參數(shù)。
函數(shù)聲明的語(yǔ)法是:
返回值類型 函數(shù)名(形參類型0 形參變量0, 形參類型1 形參變量1);
如果有多個(gè)形參,就以逗號(hào)隔開(kāi)。每個(gè)形參都有類型和變量名,其中形參變量名在聲明時(shí)可以省略。最后以分號(hào)結(jié)尾,結(jié)束聲明語(yǔ)句。
如果不想讓人看到函數(shù)的源碼,就可以只提供一個(gè)聲明和一個(gè)編譯后的文件,這樣別人就只能看匯編碼了(笑)。C語(yǔ)言的這個(gè)設(shè)計(jì),對(duì)保護(hù)知識(shí)產(chǎn)權(quán)還是有利的。
函數(shù)定義,就是在聲明之后不跟分號(hào),而是以大括號(hào)表示函數(shù)體,把函數(shù)的具體代碼寫在大括號(hào)內(nèi)部。
上圖中的main()函數(shù)就是定義,printf()函數(shù)是聲明。
定義,實(shí)現(xiàn)的是函數(shù)的內(nèi)容。函數(shù)是不能多次定義的,否則編譯器不知道采用哪個(gè)定義的代碼。
但函數(shù)可以多次聲明,只要聲明都是一樣的,不互相矛盾。
只要打了兩個(gè)大括號(hào){},就算定義了函數(shù)??諏?shí)現(xiàn)也是實(shí)現(xiàn),可以先占住這個(gè)位置,以后再填寫具體的函數(shù)代碼。即,先給出整個(gè)程序的框架來(lái),然后再填寫細(xì)節(jié)。
在實(shí)現(xiàn)了函數(shù)之后,必須去調(diào)用它,它才會(huì)運(yùn)行。
除了main函數(shù)是被shell啟動(dòng)的,其他函數(shù)都要直接或間接被main函數(shù)調(diào)用。
某一個(gè)函數(shù)在運(yùn)行時(shí),實(shí)際是存在一條從main函數(shù)到它的調(diào)用鏈的。
函數(shù)調(diào)用的語(yǔ)法是:
函數(shù)名(實(shí)參變量0, 實(shí)參變量1);
如果有多個(gè)實(shí)參,則以逗號(hào)隔開(kāi)。如果要接收函數(shù)調(diào)用的返回值,可以用一個(gè)變量去接收:
返回值變量 = 函數(shù)名(實(shí)參變量0, 實(shí)參變量1);
返回值變量的類型,要與函數(shù)的返回值類型一致,(返回值變量)在使用之前要先聲明。
對(duì)于有返回值的函數(shù),也可以不接收它的返回值。例如,printf()雖然有個(gè)int類型的返回值,用于表示打印了多少個(gè)字符,但一般不接收它。
所以C語(yǔ)言的入門代碼都是printf("hello world\n");
而不是int ret = printf("hello world\n");
函數(shù)名,在C語(yǔ)言中屬于標(biāo)志符(identity)。
標(biāo)志符的命名規(guī)則是,以下劃線或大小寫字母開(kāi)始,之后可以跟數(shù)字、字母、下劃線,(但不能跟運(yùn)算符或其他特殊符號(hào))。
它們?cè)诖a中用于表示變量名、結(jié)構(gòu)體類型名、函數(shù)名,或者給goto使用的標(biāo)號(hào)。
基本類型的類型名,都被定義為了關(guān)鍵字,不能再用作標(biāo)志符。
struct S {
int a;
int b;
} s;
S是標(biāo)志符,表示結(jié)構(gòu)體類型S。
a是標(biāo)志符,表示結(jié)構(gòu)體的成員變量a。
s是標(biāo)志符,表示變量s,它的類型是結(jié)構(gòu)體類型S。
函數(shù)名,也屬于標(biāo)志符,所以函數(shù)名也要以下劃線或大小寫字母開(kāi)始,不能是關(guān)鍵字、運(yùn)算符、或其他特殊符號(hào)。
0123,這不能做函數(shù)名,C語(yǔ)言的以0開(kāi)始的數(shù)字是八進(jìn)制數(shù)字。
0x123,也不能做函數(shù)名,以0x開(kāi)始的數(shù)字是16進(jìn)制的數(shù)字。
main,可以做函數(shù)名,這是主函數(shù),在整個(gè)程序里只能有一個(gè),不能作為普通函數(shù)的名字。
__schedule,以下劃線開(kāi)始,可以做函數(shù)名。
不過(guò),以兩個(gè)下劃線開(kāi)始的函數(shù),大多是Linux系統(tǒng)或C庫(kù)的函數(shù)。普通函數(shù)最好別這么命名。
char,這不能做函數(shù)名,它是字符類型的關(guān)鍵字。
+,這也不能,它是表示加法的運(yùn)算符。
CreateWindowEx,這可以做函數(shù)名,一看就是典型的匈牙利風(fēng)格,微軟的代碼(笑)。這個(gè)函數(shù)是windows系統(tǒng)上創(chuàng)建窗口的API。
匈牙利風(fēng)格的代碼,是從微軟開(kāi)始流行的一種風(fēng)格,函數(shù)名以一個(gè)或多個(gè)英文單詞命名,每個(gè)單詞的首字母大寫,其他字母小寫。
不過(guò)Linux的代碼(包括第三方的軟件),還是保持上古C代碼的那種下劃線風(fēng)格,全部字母小寫,單詞之間以下劃線分割,而且多使用縮寫。
有時(shí)候,縮寫之后只剩下幾個(gè)字母,就直接新組一個(gè)詞當(dāng)函數(shù)名了。
例如,Linux上啟動(dòng)新程序的函數(shù)execve(),就是個(gè)縮寫的單詞。
執(zhí)行的英文單詞叫execute,windows上的可執(zhí)行程序叫exe文件,就是這個(gè)詞的前3個(gè)字母,Linux也選了這三個(gè)字母。
cve這三個(gè)字母,來(lái)自完整的main函數(shù)的參數(shù)列表:
int main(int argc, char* argv[], char* envp);
main函數(shù)的完整聲明是上面這個(gè)樣子的,int main()這個(gè)是簡(jiǎn)化版的。
其中第一個(gè)參數(shù)argc,表示要傳給main函數(shù)的參數(shù)個(gè)數(shù)。通過(guò)命令行參數(shù)的形式傳遞。arg是參數(shù)argument的縮寫,c就是count,即參數(shù)個(gè)數(shù)。
argv,是(傳給main函數(shù)的)參數(shù)字符串的數(shù)組,v指的是vector。
envp,是環(huán)境變量的路徑,environment path。
所以,啟動(dòng)main的系統(tǒng)調(diào)用就叫作execve()了,而不叫StartProgram()。
雖然后者明顯容易理解,但它字母多啊,系統(tǒng)調(diào)用的API哪能讓人一眼就看出來(lái)是啟動(dòng)進(jìn)程的呢(汗)。
回到開(kāi)頭,main()函數(shù)在Linux上就是被execve()這個(gè)API啟動(dòng)的,然后其他函數(shù)要被main函數(shù)直接或間接調(diào)用。
不被main函數(shù)(直接或間接)調(diào)用的函數(shù),并不會(huì)運(yùn)行。
上圖的代碼只會(huì)打印add,因?yàn)閙ain只調(diào)用了add()函數(shù),沒(méi)有調(diào)用sub()函數(shù)。
這段簡(jiǎn)單的代碼,只有這三個(gè)函數(shù),sub()沒(méi)有被調(diào)用。
網(wǎng)站名稱:c語(yǔ)言函數(shù)的定義位置 c語(yǔ)言中函數(shù)如何定義
網(wǎng)址分享:http://jinyejixie.com/article16/dosesgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站內(nèi)鏈、網(wǎng)站收錄、云服務(wù)器、微信小程序、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)