聲明就是聲明一下我用到的變量或者類型,變量或者類型的實(shí)際定義并不一定在本文件內(nèi)。
成都創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站營銷推廣,域名注冊(cè),雅安服務(wù)器托管,網(wǎng)站托管、服務(wù)器租用有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,請(qǐng)聯(lián)系成都創(chuàng)新互聯(lián)。
給變量分配了空間才叫做定義,否則就是聲明
比如extern int a; 是聲明,a的定義是在別處,這里并沒有為a分配空間。
比如int a;即是定義
函數(shù)以及類型,聲明就是用函數(shù)或者類型的頭部來聲明
比如 struct x;聲明 struct x{};定義
比如 int fun();聲明 int fun(){}定義
函數(shù)的聲明與函數(shù)的定義的區(qū)別:
聲明:一般在頭文件里,對(duì)編譯器說:這里我有一個(gè)函數(shù)叫function() 讓編譯器知道這個(gè)函數(shù)的存在。
定義:一般在源文件里,具體就是函數(shù)的實(shí)現(xiàn)過程 寫明函數(shù)體。
你還可以這樣理解:
首先下圖中的程序執(zhí)行時(shí),電腦是從上到下執(zhí)行的。
也就是說假如沒有函數(shù)的聲明那一句,當(dāng)函數(shù)執(zhí)行到函數(shù)調(diào)用這一句時(shí),電腦不知道fun是什么東西,他不知道在下面有這個(gè)函數(shù)的具體實(shí)現(xiàn)。
因此,需要聲明下,告訴電腦,確實(shí)有這個(gè)東西存在,是函數(shù),在下面有定義。
擴(kuò)展資料:
集成開發(fā)環(huán)境(IDE)
Visual Studio (Visual C++)
C++ Builder
kDevelop
Anjuta
Code::Blocks:開放源碼的全功能的跨平臺(tái)C/C++集成開發(fā)環(huán)境? 。
Visual Mingw
Ideone
Eclipse CDT
Compilr
Code Lite
Netbeans C++
集成開發(fā)環(huán)境(IDE),功能齊全,調(diào)試功能很強(qiáng),程序編好后,可以立刻在環(huán)境中調(diào)試以獲得初步測(cè)試結(jié)果,然后,可以方便地做成beta版形式,拿到實(shí)際環(huán)境中進(jìn)一步測(cè)試,最后做成軟件發(fā)行版。
編譯器
Dev C++
Ultimate++
Digital Mars
C-Free
MinGW
Tiny C Compiler
參考資料:百度百科-C++
從C語言編譯器的角度來看,函數(shù)聲明只是一種協(xié)議,它告訴了調(diào)用者在調(diào)用這個(gè)函數(shù)之前需要給他什么參數(shù),一般參數(shù)是通過寄存器或者壓棧的方式傳給被調(diào)用函數(shù)的,具體這些參數(shù)如何使用以及返回什么值到相應(yīng)的寄存器里返回給調(diào)用者則是定義所描述的。
函數(shù),是編程語言中可以獨(dú)立運(yùn)行的一個(gè)代碼塊。
在C語言中,程序從main()函數(shù)開始運(yùn)行,其他函數(shù)要被main函數(shù)調(diào)用才可以運(yùn)行。
在從shell解釋器運(yùn)行編譯好的可執(zhí)行程序時(shí),main函數(shù)會(huì)被shell啟動(dòng),開始運(yùn)行。
C語言的函數(shù)在使用時(shí)要經(jīng)過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ù)聲明的語法是:
返回值類型 函數(shù)名(形參類型0 形參變量0, 形參類型1 形參變量1);
如果有多個(gè)形參,就以逗號(hào)隔開。每個(gè)形參都有類型和變量名,其中形參變量名在聲明時(shí)可以省略。最后以分號(hào)結(jié)尾,結(jié)束聲明語句。
如果不想讓人看到函數(shù)的源碼,就可以只提供一個(gè)聲明和一個(gè)編譯后的文件,這樣別人就只能看匯編碼了(笑)。C語言的這個(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è)程序的框架來,然后再填寫細(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)用的語法是:
函數(shù)名(實(shí)參變量0, 實(shí)參變量1);
如果有多個(gè)實(shí)參,則以逗號(hào)隔開。如果要接收函數(shù)調(diào)用的返回值,可以用一個(gè)變量去接收:
返回值變量 = 函數(shù)名(實(shí)參變量0, 實(shí)參變量1);
返回值變量的類型,要與函數(shù)的返回值類型一致,(返回值變量)在使用之前要先聲明。
對(duì)于有返回值的函數(shù),也可以不接收它的返回值。例如,printf()雖然有個(gè)int類型的返回值,用于表示打印了多少個(gè)字符,但一般不接收它。
所以C語言的入門代碼都是printf("hello world\n");
而不是int ret = printf("hello world\n");
函數(shù)名,在C語言中屬于標(biāo)志符(identity)。
標(biāo)志符的命名規(guī)則是,以下劃線或大小寫字母開始,之后可以跟數(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ù)名也要以下劃線或大小寫字母開始,不能是關(guān)鍵字、運(yùn)算符、或其他特殊符號(hào)。
0123,這不能做函數(shù)名,C語言的以0開始的數(shù)字是八進(jìn)制數(shù)字。
0x123,也不能做函數(shù)名,以0x開始的數(shù)字是16進(jìn)制的數(shù)字。
main,可以做函數(shù)名,這是主函數(shù),在整個(gè)程序里只能有一個(gè),不能作為普通函數(shù)的名字。
__schedule,以下劃線開始,可以做函數(shù)名。
不過,以兩個(gè)下劃線開始的函數(shù),大多是Linux系統(tǒng)或C庫的函數(shù)。普通函數(shù)最好別這么命名。
char,這不能做函數(shù)名,它是字符類型的關(guān)鍵字。
+,這也不能,它是表示加法的運(yùn)算符。
CreateWindowEx,這可以做函數(shù)名,一看就是典型的匈牙利風(fēng)格,微軟的代碼(笑)。這個(gè)函數(shù)是windows系統(tǒng)上創(chuàng)建窗口的API。
匈牙利風(fēng)格的代碼,是從微軟開始流行的一種風(fēng)格,函數(shù)名以一個(gè)或多個(gè)英文單詞命名,每個(gè)單詞的首字母大寫,其他字母小寫。
不過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è)字母,來自完整的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ù)。通過命令行參數(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哪能讓人一眼就看出來是啟動(dòng)進(jìn)程的呢(汗)。
回到開頭,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ù),沒有調(diào)用sub()函數(shù)。
這段簡(jiǎn)單的代碼,只有這三個(gè)函數(shù),sub()沒有被調(diào)用。