c++ 宣告和定義
宣告和定義最主要的區別是:宣告不申請記憶體空間而定義申請記憶體空間。
定義申請記憶體空間這點需要...好像很多人這樣理解 我怎麼以為這有點問題
這裡有個簡單的錯誤,尤其是對我以c#的情景來理解c++。
標頭檔案中的 int a;(全域性變數這樣寫)在c++ 中是定義。這裡有個情況是 如果 int a;在自定義的型別中,將不再是定義。因為其不占用記憶體。
如果在函式體內,int a;這還是定義。
需要說明的是變數的定義和初始化是2個概念,請不要理解為乙個。
一般變數的定義和初始化為在一起。即 int a=10;特別注意對定義的變數不進行初始化就直接使用的話,會產生無法預知的情況。
(這裡有個情況:區域性變數必須初始化才能用,全域性變數如果沒有初始化編譯器會有預設值?類的字段的情況?與c#區別)
在同乙個作用域(這點該怎麼說呢?),只能定義一次。
一次定義規則:是指定義在所有進入連線的編譯單元中只能有一次。
2、extern關鍵字
extern 可以置於變數或者函式前,以表示變數或者函式的定義在別的檔案中。提示編譯器遇到此變數和函式時在其他模組中尋找其定義。另外,extern也可用來進行連線指定(dll)
vs編譯器是採用按檔案編譯的方式,因此在編譯時,各個檔案中的定義的全域性變數是相互透明的,也就是說,在編譯時候,全域性變數的可見域限制在檔案內部。
連線階段,各個檔案的內容(實際是編譯產生的obj檔案)是被合併到一起的。因而,定義於某檔案內的全域性變數,在鏈結完成後,它的可見性範圍被擴大到了整個程式。
extern的原理很簡單,就是告訴編譯器 ,當前變數在其它檔案中定義。
extern 函式
常見extern放在函式的前面成為函式宣告的一部分。
如果函式的宣告中帶有關鍵字extern,僅僅是暗示這個函式可能在別的原始檔中定義,沒有其它作用。
即:extern int f();和 int f();沒有區別
extern "c"
c++ 環境下使用c函式的時候,常常會出現編譯器無法找到obj模組中的c函式定義,從而導致鏈結失敗。
c++ 語言在編譯的時候為了解決函式的多型問題,會將函式名和引數聯合起來生成乙個中間的函式名稱。
而c語言則不會。因此會造成鏈結時找不到對應的函式的情況。此時c函式就需要用extern "c" 進行鏈結指定
告訴編譯器,請保持我的名稱,不要給我生成用於鏈結的中間函式名。
被extern 「c」修飾的變數和函式時按照c語言方式編譯和鏈結的;
c++ 支援函式過載,而過程式c則不支援,
c 宣告和定義
標頭檔案中的 全域性 變數只能放宣告,不能定義 標頭檔案中的變數只能宣告,不能定義,否則其他多個.c檔案包含該標頭檔案,出現重複定義,導致鏈結出錯。ifndef define endif防止的是 重複編譯 而不是 重複定義 重複編譯可能造成重複定義,但重複定義的 不只有重複編譯 從 變成可執行的程式...
c 的宣告和定義
c 中,除了inline函式和符號常量之外,普通的物件和函式只能被定義一次,所以.h的標頭檔案就用來儲存物件和函式的宣告,而將定義儲存在乙個.cpp中,其它要使用該物件或函式的.cpp檔案就可以包含該.h標頭檔案。同時使用extern字首表示 該物件已經在別處被定義,這裡只是給編譯器乙個提示。同時,...
宣告和定義
宣告 向計算機介紹名字,它說,這個名字是什麼意思 而 定義 為這個名字分配 儲存空間。無論涉及到變數時還是函式時含義都一樣。無論在哪種情況下,編譯器都在 定義 處分配儲存空間。對於變數,編譯器確定這個變數佔多少儲存單元,並在記憶體中產生存放它們 的空間。對於函式,編譯器產生 並為之分配儲存空間。函式...