c語言函數(shù)的定義放在哪 c語言函數(shù)的定義放在哪個位置

C語言的函數(shù)定義一定要放在程序最后面嗎

可以放在后面,如果放到main后面,則在要前面進(jìn)行函數(shù)聲明,比如,以下代碼塊:

創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為新興企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設(shè),新興網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

#include stdio.h

int myfun(int n); //此為函數(shù)聲明

int main(void)

{

...... //此為省略代碼

}

int myfun(int n) //此為函數(shù)定義

{

return n*n;

}

函數(shù)聲明與函數(shù)定義分別在程序中的什么位置?為什么?

函數(shù),是編程語言中可以獨(dú)立運(yùn)行的一個代碼塊。

在C語言中,程序從main()函數(shù)開始運(yùn)行,其他函數(shù)要被main函數(shù)調(diào)用才可以運(yùn)行。

在從shell解釋器運(yùn)行編譯好的可執(zhí)行程序時,main函數(shù)會被shell啟動,開始運(yùn)行。

C語言的函數(shù)在使用時要經(jīng)過3個步驟:聲明、定義、調(diào)用。

函數(shù)聲明,就是給出函數(shù)的原型,讓程序員知道怎么給函數(shù)傳參數(shù),怎么接收返回值,讓編譯器知道怎么進(jìn)行代碼的類型檢查。main函數(shù)的聲明是這樣的:

int main();

它的返回值是int類型,不需要傳參數(shù)。

printf()函數(shù)的聲明是這樣的:int printf(const char* fmt, ...);

它的返回值是int類型,第一個參數(shù)是格式字符串,之后可以跟可變參數(shù)。

函數(shù)聲明的語法是:

返回值類型 函數(shù)名(形參類型0 形參變量0, 形參類型1 形參變量1);

如果有多個形參,就以逗號隔開。每個形參都有類型和變量名,其中形參變量名在聲明時可以省略。最后以分號結(jié)尾,結(jié)束聲明語句。

如果不想讓人看到函數(shù)的源碼,就可以只提供一個聲明和一個編譯后的文件,這樣別人就只能看匯編碼了(笑)。C語言的這個設(shè)計,對保護(hù)知識產(chǎn)權(quán)還是有利的。

函數(shù)定義,就是在聲明之后不跟分號,而是以大括號表示函數(shù)體,把函數(shù)的具體代碼寫在大括號內(nèi)部。

上圖中的main()函數(shù)就是定義,printf()函數(shù)是聲明。

定義,實(shí)現(xiàn)的是函數(shù)的內(nèi)容。函數(shù)是不能多次定義的,否則編譯器不知道采用哪個定義的代碼。

但函數(shù)可以多次聲明,只要聲明都是一樣的,不互相矛盾。

只要打了兩個大括號{},就算定義了函數(shù)。空實(shí)現(xiàn)也是實(shí)現(xiàn),可以先占住這個位置,以后再填寫具體的函數(shù)代碼。即,先給出整個程序的框架來,然后再填寫細(xì)節(jié)。

在實(shí)現(xiàn)了函數(shù)之后,必須去調(diào)用它,它才會運(yùn)行。

除了main函數(shù)是被shell啟動的,其他函數(shù)都要直接或間接被main函數(shù)調(diào)用。

某一個函數(shù)在運(yùn)行時,實(shí)際是存在一條從main函數(shù)到它的調(diào)用鏈的。

函數(shù)調(diào)用的語法是:

函數(shù)名(實(shí)參變量0, 實(shí)參變量1);

如果有多個實(shí)參,則以逗號隔開。如果要接收函數(shù)調(diào)用的返回值,可以用一個變量去接收:

返回值變量 = 函數(shù)名(實(shí)參變量0, 實(shí)參變量1);

返回值變量的類型,要與函數(shù)的返回值類型一致,(返回值變量)在使用之前要先聲明。

對于有返回值的函數(shù),也可以不接收它的返回值。例如,printf()雖然有個int類型的返回值,用于表示打印了多少個字符,但一般不接收它。

所以C語言的入門代碼都是printf("hello world\n");

而不是int ret = printf("hello world\n");

函數(shù)名,在C語言中屬于標(biāo)志符(identity)。

標(biāo)志符的命名規(guī)則是,以下劃線或大小寫字母開始,之后可以跟數(shù)字、字母、下劃線,(但不能跟運(yùn)算符或其他特殊符號)。

它們在代碼中用于表示變量名、結(jié)構(gòu)體類型名、函數(shù)名,或者給goto使用的標(biā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ù)名也要以下劃線或大小寫字母開始,不能是關(guān)鍵字、運(yùn)算符、或其他特殊符號。

0123,這不能做函數(shù)名,C語言的以0開始的數(shù)字是八進(jìn)制數(shù)字。

0x123,也不能做函數(shù)名,以0x開始的數(shù)字是16進(jìn)制的數(shù)字。

main,可以做函數(shù)名,這是主函數(shù),在整個程序里只能有一個,不能作為普通函數(shù)的名字。

__schedule,以下劃線開始,可以做函數(shù)名。

不過,以兩個下劃線開始的函數(shù),大多是Linux系統(tǒng)或C庫的函數(shù)。普通函數(shù)最好別這么命名。

char,這不能做函數(shù)名,它是字符類型的關(guān)鍵字。

+,這也不能,它是表示加法的運(yùn)算符。

CreateWindowEx,這可以做函數(shù)名,一看就是典型的匈牙利風(fēng)格,微軟的代碼(笑)。這個函數(shù)是windows系統(tǒng)上創(chuàng)建窗口的API。

匈牙利風(fēng)格的代碼,是從微軟開始流行的一種風(fēng)格,函數(shù)名以一個或多個英文單詞命名,每個單詞的首字母大寫,其他字母小寫。

不過Linux的代碼(包括第三方的軟件),還是保持上古C代碼的那種下劃線風(fēng)格,全部字母小寫,單詞之間以下劃線分割,而且多使用縮寫。

有時候,縮寫之后只剩下幾個字母,就直接新組一個詞當(dāng)函數(shù)名了。

例如,Linux上啟動新程序的函數(shù)execve(),就是個縮寫的單詞。

執(zhí)行的英文單詞叫execute,windows上的可執(zhí)行程序叫exe文件,就是這個詞的前3個字母,Linux也選了這三個字母。

cve這三個字母,來自完整的main函數(shù)的參數(shù)列表:

int main(int argc, char* argv[], char* envp);

main函數(shù)的完整聲明是上面這個樣子的,int main()這個是簡化版的。

其中第一個參數(shù)argc,表示要傳給main函數(shù)的參數(shù)個數(shù)。通過命令行參數(shù)的形式傳遞。arg是參數(shù)argument的縮寫,c就是count,即參數(shù)個數(shù)。

argv,是(傳給main函數(shù)的)參數(shù)字符串的數(shù)組,v指的是vector。

envp,是環(huán)境變量的路徑,environment path。

所以,啟動main的系統(tǒng)調(diào)用就叫作execve()了,而不叫StartProgram()。

雖然后者明顯容易理解,但它字母多啊,系統(tǒng)調(diào)用的API哪能讓人一眼就看出來是啟動進(jìn)程的呢(汗)。

回到開頭,main()函數(shù)在Linux上就是被execve()這個API啟動的,然后其他函數(shù)要被main函數(shù)直接或間接調(diào)用。

不被main函數(shù)(直接或間接)調(diào)用的函數(shù),并不會運(yùn)行。

上圖的代碼只會打印add,因?yàn)閙ain只調(diào)用了add()函數(shù),沒有調(diào)用sub()函數(shù)。

這段簡單的代碼,只有這三個函數(shù),sub()沒有被調(diào)用。

C語言函數(shù)聲明是要在主函數(shù)內(nèi)部還是外部?。?/h2>

函數(shù)聲明定義 放在 主函數(shù)以外,與主函數(shù)地位 并列,不能放在主函數(shù)以內(nèi)。

函數(shù)定義 放在 主函數(shù) 以后,那么在 主函數(shù)以前,或 在主函數(shù)聲明部分(語句以前)要添加函數(shù)原型聲明。

函數(shù)聲明定義,若放在主函數(shù)以前, 主函數(shù)中 則 不需要 函數(shù)原型聲明。

程序結(jié)構(gòu):

int main()

{

int process(int u,int t,int (*p)(int u,int t)); // 函數(shù)原型聲明

int a,b,c[3],i;

int max(int x,int y); // 函數(shù)原型聲明

int min(int j,int k); // 函數(shù)原型聲明

int sum(int q,int w); // 函數(shù)原型聲明

scanf("%d%d",a,b); // 這是語句,要放到聲明以后,所以搬動到這里

。。。 // 其他語句

}

int max(int x,int y) // 函數(shù)聲明定義,在主函數(shù)以后

{if(yx)x=y;

return x;

}

。。。 // 其他 函數(shù)聲明定義

c語言中自定義函數(shù)安放位置問題

放在后面,要先聲明下原型,這樣編譯器在編譯時,就可以知道有這個函數(shù),會往下面查找,并編譯。

放在前面,可以直接定義,main中使用。

放前放后,純屬個人編寫風(fēng)格,并無硬性規(guī)定。

個人喜歡放在前面,這樣,看代碼時,直接從下面的MAIN函數(shù)看起,遇到定義的函數(shù),上翻查看。

當(dāng)前標(biāo)題:c語言函數(shù)的定義放在哪 c語言函數(shù)的定義放在哪個位置
分享URL:http://muchs.cn/article20/dosceco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、Google、外貿(mào)建站、企業(yè)建站、ChatGPT商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)