可以放在后面,如果放到main后面,則在要前面進行函數(shù)聲明,比如,以下代碼塊:
創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為新興企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設,新興網(wǎng)站改版等技術服務。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
#include stdio.h
int myfun(int n); //此為函數(shù)聲明
int main(void)
{
...... //此為省略代碼
}
int myfun(int n) //此為函數(shù)定義
{
return n*n;
}
函數(shù),是編程語言中可以獨立運行的一個代碼塊。
在C語言中,程序從main()函數(shù)開始運行,其他函數(shù)要被main函數(shù)調(diào)用才可以運行。
在從shell解釋器運行編譯好的可執(zhí)行程序時,main函數(shù)會被shell啟動,開始運行。
C語言的函數(shù)在使用時要經(jīng)過3個步驟:聲明、定義、調(diào)用。
函數(shù)聲明,就是給出函數(shù)的原型,讓程序員知道怎么給函數(shù)傳參數(shù),怎么接收返回值,讓編譯器知道怎么進行代碼的類型檢查。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語言的這個設計,對保護知識產(chǎn)權(quán)還是有利的。
函數(shù)定義,就是在聲明之后不跟分號,而是以大括號表示函數(shù)體,把函數(shù)的具體代碼寫在大括號內(nèi)部。
上圖中的main()函數(shù)就是定義,printf()函數(shù)是聲明。
定義,實現(xiàn)的是函數(shù)的內(nèi)容。函數(shù)是不能多次定義的,否則編譯器不知道采用哪個定義的代碼。
但函數(shù)可以多次聲明,只要聲明都是一樣的,不互相矛盾。
只要打了兩個大括號{},就算定義了函數(shù)??諏崿F(xiàn)也是實現(xiàn),可以先占住這個位置,以后再填寫具體的函數(shù)代碼。即,先給出整個程序的框架來,然后再填寫細節(jié)。
在實現(xiàn)了函數(shù)之后,必須去調(diào)用它,它才會運行。
除了main函數(shù)是被shell啟動的,其他函數(shù)都要直接或間接被main函數(shù)調(diào)用。
某一個函數(shù)在運行時,實際是存在一條從main函數(shù)到它的調(diào)用鏈的。
函數(shù)調(diào)用的語法是:
函數(shù)名(實參變量0, 實參變量1);
如果有多個實參,則以逗號隔開。如果要接收函數(shù)調(diào)用的返回值,可以用一個變量去接收:
返回值變量 = 函數(shù)名(實參變量0, 實參變量1);
返回值變量的類型,要與函數(shù)的返回值類型一致,(返回值變量)在使用之前要先聲明。
對于有返回值的函數(shù),也可以不接收它的返回值。例如,printf()雖然有個int類型的返回值,用于表示打印了多少個字符,但一般不接收它。
所以C語言的入門代碼都是printf("hello world\n");
而不是int ret = printf("hello world\n");
函數(shù)名,在C語言中屬于標志符(identity)。
標志符的命名規(guī)則是,以下劃線或大小寫字母開始,之后可以跟數(shù)字、字母、下劃線,(但不能跟運算符或其他特殊符號)。
它們在代碼中用于表示變量名、結(jié)構(gòu)體類型名、函數(shù)名,或者給goto使用的標號。
基本類型的類型名,都被定義為了關鍵字,不能再用作標志符。
struct S {
int a;
int b;
} s;
S是標志符,表示結(jié)構(gòu)體類型S。
a是標志符,表示結(jié)構(gòu)體的成員變量a。
s是標志符,表示變量s,它的類型是結(jié)構(gòu)體類型S。
函數(shù)名,也屬于標志符,所以函數(shù)名也要以下劃線或大小寫字母開始,不能是關鍵字、運算符、或其他特殊符號。
0123,這不能做函數(shù)名,C語言的以0開始的數(shù)字是八進制數(shù)字。
0x123,也不能做函數(shù)名,以0x開始的數(shù)字是16進制的數(shù)字。
main,可以做函數(shù)名,這是主函數(shù),在整個程序里只能有一個,不能作為普通函數(shù)的名字。
__schedule,以下劃線開始,可以做函數(shù)名。
不過,以兩個下劃線開始的函數(shù),大多是Linux系統(tǒng)或C庫的函數(shù)。普通函數(shù)最好別這么命名。
char,這不能做函數(shù)名,它是字符類型的關鍵字。
+,這也不能,它是表示加法的運算符。
CreateWindowEx,這可以做函數(shù)名,一看就是典型的匈牙利風格,微軟的代碼(笑)。這個函數(shù)是windows系統(tǒng)上創(chuàng)建窗口的API。
匈牙利風格的代碼,是從微軟開始流行的一種風格,函數(shù)名以一個或多個英文單詞命名,每個單詞的首字母大寫,其他字母小寫。
不過Linux的代碼(包括第三方的軟件),還是保持上古C代碼的那種下劃線風格,全部字母小寫,單詞之間以下劃線分割,而且多使用縮寫。
有時候,縮寫之后只剩下幾個字母,就直接新組一個詞當函數(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哪能讓人一眼就看出來是啟動進程的呢(汗)。
回到開頭,main()函數(shù)在Linux上就是被execve()這個API啟動的,然后其他函數(shù)要被main函數(shù)直接或間接調(diào)用。
不被main函數(shù)(直接或間接)調(diào)用的函數(shù),并不會運行。
上圖的代碼只會打印add,因為main只調(diào)用了add()函數(shù),沒有調(diào)用sub()函數(shù)。
這段簡單的代碼,只有這三個函數(shù),sub()沒有被調(diào)用。
函數(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ù)聲明定義
放在后面,要先聲明下原型,這樣編譯器在編譯時,就可以知道有這個函數(shù),會往下面查找,并編譯。
放在前面,可以直接定義,main中使用。
放前放后,純屬個人編寫風格,并無硬性規(guī)定。
個人喜歡放在前面,這樣,看代碼時,直接從下面的MAIN函數(shù)看起,遇到定義的函數(shù),上翻查看。
當前標題:c語言函數(shù)的定義放在哪 c語言函數(shù)的定義放在哪個位置
分享URL:http://jinyejixie.com/article20/dosceco.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、Google、外貿(mào)建站、企業(yè)建站、ChatGPT、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)