若是是指變量的聲明和定義:
從編譯原理上來講,聲明是僅僅告訴編譯器,有個某類型的變量會被使用,可是編譯器並不會爲它分配任何內存。而
定義就是分配了內存。
對於下面的兩句代碼:
void Func()
{
int a;
int b=1;
a=0;
}
對於第一行代碼,編譯器不會作任何事,它不會爲它在棧中分配一點東西,直到第三句,a=0;時,編譯器纔會將其壓入棧中。而對於int b=0;這一句,編譯器就會生成一條指令,爲它賦值。若是反彙編,看到的代碼多是這樣的:
push 1;
push 0;
固然,並不必定編譯器就會樣作,也有可能在聲明int a時,編譯器就會把一個廢值入棧,到第三條再爲其賦值,這要看編譯器的具體取捨,因此,聲明不必定不是定義,而定義必定是定義。
可是,下面的聲明,必定僅僅是聲明:
extern int a;
這表時,有一個int變量a,它必定是在另外其餘地方定義的,因此編譯器此時必定不會作什麼分配內存的事,由於它就是聲明,僅僅代表下面的代碼引用了一個符號,而這個符號是int類型的a而已。
若是是指函數的聲明和定義:
聲明:通常在頭文件裏,對編譯器說:這裏我有一個函數叫function() 讓編譯器知道這個函數的存在。
定義:通常在源文件裏,具體就是函數的實現過程 寫明函數體。
轉自:http://zhidao.baidu.com/question/337113067.html