1. 程式人生 > >C++中extern關鍵字用法小結

C++中extern關鍵字用法小結

總結C++中關於extern關鍵字的用法。

1.變數的生明和定義中

C++語言支援分離式編譯機制,該機制允許將程式分割為若干個檔案,每個檔案可被獨立編譯。為了將程式分為許多檔案,則需要在檔案中共享程式碼,例如一個檔案的程式碼可能需要另一個檔案中中定義的變數。

為了支援分離式編譯,C++允許將宣告和定義分離開來。變數的宣告規定了變數的型別和名字,即使一個名字為程式所知,一個檔案如果想使用別處定義的名字則必須包含對那個名字的宣告。定義則負責建立與名字關聯的實體,定義還申請儲存空間。

如果想宣告一個變數而非定義它,就在變數名前新增extern關鍵字,而且不要顯式地初始化變數:

extern int i;  //宣告i而非定義
int j;         //宣告並定義i

但我們也可以給由extern關鍵字標記的變數賦一個初始值,但這樣就不是一個聲明瞭,而是一個定義:

extern int v = 2;
int v = 2;     //這兩個語句效果完全一樣,都是v的定義

注意: 變數能且只能被定義一次,但是可以被宣告多次。

2.在多個檔案中共享const物件

預設情況下,一個const物件僅在本檔案內有效,如果多個檔案中出現了同名的const變數時,其實等同於在不同的檔案中分別定義了獨立的變數。

某些時候有這樣一種const變數,它的初始值不是一個常量表達式,但又確實有必要在檔案間共享。這種情況下,我們不希望編譯器為每個檔案分別生成獨立的變數。我們想讓這類const物件像其他非常量物件一樣工作,也就是說,只在一個檔案中定義const,而在其他多個檔案中宣告並使用它。

方法是對於const變數不管是宣告還是定義都新增extern關鍵字,這樣只需要定義一次就可以了:

//file1.cpp定義並初始化和一個常量,該常量能被其他檔案訪問
extern const int bufferSize = function();
//file1.h標頭檔案
extern const int bufferSize; //與file1.cpp中定義的是同一個

file1.h標頭檔案中的宣告也由extern做了限定,其作用是指明bufferSize並非本檔案獨有,它的定義將出現在別處。

3.模板的控制例項化

當兩個或者多個獨立編譯的原始檔中使用了相同的模板並且提供了相同的模板引數時,每個檔案中都會有該模板的一個例項。

在大系統中,在多個檔案中例項化相同的模板的額外開銷可能非常嚴重,在C++11新標準中,我們可以通過顯式例項化來避免這種開銷。一個顯式例項化具有如下形式:

extern template declaration; //例項化宣告
template declaration;        //例項化定義

declaration是一個類或函式的宣告,其中所有的模板引數都已經被替換成為模板實參。例如:

extern template class vec<string>;       //宣告
template int sum(const int, const int);  //定義

當編譯器遇到extern模板宣告時,它不會在本檔案中生成例項化程式碼,將一個例項化宣告為extern就表示承諾在程式的其他位置有該例項化的一個非extern定義。對於一個給定的例項化版本,可能有多個extern宣告,但必須只有一個定義。

由於編譯器在使用一個模板時自動對其例項化,因此extern宣告必須出現在任何使用此例項化吧版本的程式碼之前。

由於以上討論可知:extern一般是使用在多檔案之間需要共享某些程式碼時。

相關推薦

C++extern關鍵字用法小結

總結C++中關於extern關鍵字的用法。 1.變數的生明和定義中 C++語言支援分離式編譯機制,該機制允許將程式分割為若干個檔案,每個檔案可被獨立編譯。為了將程式分為許多檔案,則需要在檔案中共享程式碼,例如一個檔案的程式碼可能需要另一個檔案中中定義的變數。 為了支援分離式編譯,C++允許將宣告和定義分離開來

C/C++extern關鍵字詳解

編譯器 fin 生成 接口 bcd 只需要 c++環境 結束 編程 轉自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 1 基本解釋:extern可以置於變量或者函數前,以標示變量或者

c++extern關鍵字和static的作用域的學習

之前對static修飾變數後作用域的問題一直是大體瞭解,感覺和普通變數的作用域並沒有什麼區別。聚個栗子 在A.h中: #pragma once static int a=365; class A { public: A(); ~A(); }; 在main.c中: #include

C++extern關鍵字使用

chapter 1 . extern關鍵字的作用     extern是一個關鍵字,它告訴編譯器存在著一個變數或者一個函式,如果在當前編譯語句的前面中沒有找到相應的變數或者函式,也會在當前檔案的後面或者其它檔案中定義,來看下面的例子。 // extern.cpp : De

C++extern關鍵字的作用

1 基本解釋:extern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。此外extern也可用來進行連結指定。       也就是說extern有兩個作用,第一個,當它與"C"一起連用時,如: exte

C/C++extern用法

-------------------------------------------------------------------------------- 本文屬作者原創,如有轉載,請註明作者以及原址連結。 謝謝!                          

C/C++auto、static、register、extern關鍵字區別小結

1. 說明   以上四種都是變數儲存說明符,因為C/C++語言在變數定義時候的完整語法是:      [儲存說明符] [資料型別] [變數名稱] [=初始化];   因為大多我們宣告的變數都

C/C++const關鍵字用法及其與宏定義的比較

類型安全 屬性 const關鍵字 code oid 程序 函數返回值 存儲空間 臨時對象 1.const關鍵字的性質 簡單來說:const關鍵字修飾的變量具有常屬性。 即它所修飾的變量不能被修改。 2.修飾局部變量 1 const int a = 10; 2 int co

C++: extern關鍵字功能和用法研究

今天遇到在aaa.cpp檔案中定義如下函式:                                   &nbs

C++virtual關鍵字用法

關於virtual關鍵字的用法總結如下,有錯誤或者總結不到位的情況請能幫本人指出,非常感謝! Virtual是C++ OO機制中很重要的一個關鍵字。只要是學過C++的人都知道在類Base中加了Virtual關鍵字的函式就是虛擬函式。 基類的函式呼叫如果有virtual則根據

C#New關鍵字的三種用法

三種用法如下:   在 C# 中,new 關鍵字可用作運算子、修飾符或約束。   1)new 運算子:用於建立物件和呼叫建構函式。這種大家都比較熟悉,沒什麼好說的了。   2)new 修飾符:在用作修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。   3)n

C++this關鍵字用法

C++裡面的this關鍵字:簡介:在C++裡面,每一個物件都能通過this指標來訪問自己的地址。this是所有成員函式的隱藏引數。用法:    在C++中,當成員函式中某個變數與成員變數名字相同,則使用this關鍵字來表示成員變數。 或者,需要返回類變數或者結構體變數的時候,

C#base關鍵字的幾種用法

body action 調用 ace using value tel 實例化 library base其實最大的使用地方在面相對性開發的多態性上,base可以完成創建派生類實例時調用其基類構造函數或者調用基類上已被其他方法重寫的方法。例如: 2.1關於base調用基類構造函

Javastatic關鍵字用法總結

副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta

c#params關鍵字應用

語言 bsp for arr als new 傳參數 lin long c#params應用 params 是C#開發語言中關鍵字, params主要的用處是在給函數傳參數的時候用,就是當函數的參數不固定的時候。 在方法聲明中的 params 關鍵字之後不允許任何其他參數,

C++static關鍵字作用總結

可見性 apple 局部變量 內存 父類靜態 初始化 ati 退出 變量存儲 1.先來介紹它的第一條也是最重要的一條:隱藏。(static函數,static變量均可) 當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。舉例來說明。同時編譯兩個源

淺析C++static關鍵字

參數 extern 函數 iostream 出現 har 兩個 什麽 註意事項 C++的static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用於普通變量和函數,不涉及類;後者主要說明static在類中的作用。 一、面向過程設計中

C#問號的用法

變量 ring 返回 express () operator boolean per 泛型 1. 可空類型修飾符(?):   引用類型可以使用空引用表示一個不存在的值,而值類型通常不能表示為空。   例如: string str=null;是正確的。 int

C#HttpWebRequest的用法詳解

網站 default 編碼方式 對數 c# toarray collect acc like 本文實例講述了C#中HttpWebRequest的用法。分享給大家供大家參考。具體如下: HttpWebRequest類主要利用HTTP 協議和服務器交互,通常是通過 GET 和

C#HashTable的用法

會有 string false border div hash 包含 tool each 首先,從命名空間開始 System.Collections 接下來進入正題.               Hashtable的常用方法和屬性: