日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++中extern的使用

發(fā)布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中extern的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在C++中,extern主要有兩個作用:(1)、extern聲明一個變量或函數(shù);(2)、extern與”C”一起連用,用于鏈接指定。關(guān)于extern “C”的使用可以參考:?http://blog.csdn.net/fengbingchun/article/details/78634831 ,這里主要介紹extern聲明一個變量或函數(shù)時的用法。

extern可置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量或函數(shù)時,在其它模塊中尋找其定義。

如果想聲明一個變量而非定義它,就在變量名稱前加關(guān)鍵字extern,而且不要顯示地初始化變量。任何包含了顯示初始化的聲明即成為定義。我們能給由extern關(guān)鍵字標(biāo)記的變量賦一個初始值,但是這么做也就抵消了extern的作用。extern語句如果包含初始值就不再是聲明,而變成定義了。在函數(shù)體內(nèi)部,如果試圖初始化一個由extern關(guān)鍵字標(biāo)記的變量,將引發(fā)錯誤變量能且只能被定義一次,但是可以被多次聲明。聲明和定義的區(qū)別看起來也許微不足道,但實(shí)際上卻非常重要。如果要在多個文件中使用同一個變量,就必須將聲明和定義分離。此時,變量的定義必須出現(xiàn)在且只能出現(xiàn)在一個文件中,而其它用到該變量的文件必須對其進(jìn)行聲明,卻絕對不能重復(fù)定義。

某些時候有這樣一種const變量,它的初始值不是一個常量表達(dá)式,但又確實(shí)有必要在文件間共享。這種情況下,我們不希望編譯器為每個文件分別生成獨(dú)立的變量。相反,我們想讓這類const對象像其它(非常量)對象一樣工作,也就是說,只在一個文件中定義const,而在其它多個文件中聲明并使用它。解決的辦法是,對于const變量不管是聲明還是定義都添加extern關(guān)鍵字,這樣只需定義一次就可以了。如果想在多個文件之間共享const對象,必須在變量的定義之前添加extern關(guān)鍵字

在大系統(tǒng)中,在多個文件中實(shí)例化相同模板的額外開銷可能非常嚴(yán)重。在新標(biāo)準(zhǔn)中,我們可以通過顯示實(shí)例化(explicit instantiation)來避免這種開銷。一個顯示實(shí)例化有如下形式:

extern template declaration; // 實(shí)例化聲明
template declaration; // 實(shí)例化定義
declaration是一個類或函數(shù)聲明,其中所有模板參數(shù)已被替換為模板實(shí)參。 當(dāng)編譯器遇到extern模板聲明時,它不會在本文件中生成實(shí)例化代碼。將一個實(shí)例化聲明為extern就表示承諾在程序其它位置有該實(shí)例化的一個非extern聲明(定義)。對于一個給定的實(shí)例化版本,可能有多個extern聲明,但必須只有一個定義。由于編譯器在使用一個模板時自動對其實(shí)例化,因此extern聲明必須出現(xiàn)在任何使用此實(shí)例化版本的代碼之前。當(dāng)編譯器遇到一個實(shí)例化定義(與聲明相對)時,它為其生成代碼。 對每個實(shí)例化聲明,在程序中某個位置必須有其顯示的實(shí)例化定義。一個類模板的實(shí)例化定義會實(shí)例化該模板的所有成員,包括內(nèi)聯(lián)的成員函數(shù)。當(dāng)編譯器遇到一個實(shí)例化定義時,它不了解程序使用哪些成員函數(shù)。因此,與處理類模板的普通實(shí)例化不同,編譯器會實(shí)例化該類的所有成員。即使我們不使用某個成員,它也會被實(shí)例化。因此,我們用來顯示實(shí)例化一個類模板的類型,必須能用于模板的所有成員。 在一個類模板的實(shí)例化定義中,所用類型必須能用于模板的所有成員函數(shù)

模板顯示實(shí)例化(explicit instantiation):一個聲明,為所有模板參數(shù)提供了顯示實(shí)參。用來指導(dǎo)實(shí)例化過程。如果聲明是extern的,模板將不會被實(shí)例化;否則,模板將利用指定的實(shí)參進(jìn)行實(shí)例化。對每個extern模板聲明,在程序中某處必須有一個非extern的顯示實(shí)例化

關(guān)鍵字extern為聲明但不定義一個對象提供了一種方法,實(shí)際上它類似于函數(shù)聲明,承諾了該對象會在其它地方被定義或者在此文本文件中的其它地方,或者在程序的其它文本文件中。extern聲明不會引起內(nèi)存被分配,它可以在同一文件中或同一程序的不同文件中出現(xiàn)多次。關(guān)鍵字extern也可以在函數(shù)聲明中指定,唯一的影響是將該聲明為隱式屬性,在其它地方定義,變?yōu)轱@示的。extern關(guān)鍵字告訴編譯器,”這個變量可能定義在這個模塊或其它模塊中”,一個extern聲明并沒有生成數(shù)據(jù),它僅表明這個數(shù)據(jù)是共享的。這個變量必須是在別處定義過的,而且它只能定義一次。

以下是測試代碼:

extern.hpp:

#ifndef FBC_CPPBASE_TEST_EXTERN_HPP_
#define FBC_CPPBASE_TEST_EXTERN_HPP_namespace extern_ {extern const int bufsize; // 與.cpp中定義的bufsize是同一個int test_extern_1();
int test_extern_2();} // namespace extern_#endif // FBC_CPPBASE_TEST_EXTERN_HPP_
extern.cpp:

#include "extern.hpp"
#include <iostream>extern std::string extern_variable_blog_addr;
extern std::string extern_variable_github_addr;
extern int extern_function_add(int a, int b);
extern const std::string extern_function_name();namespace extern_ {namespace {int fcn() { return 0; }
}extern double pi = 3.1415; // 定義/* reference: C++ Primer(Fifth 中文版) pages 63
某些時候有這樣一種const變量,它的初始值不是一個常量表達(dá)式,但又確實(shí)有必要在文件間共享。
這種情況下,我們不希望編譯器為每個文件分別生成獨(dú)立的變量。相反,我們想讓這類const對象
像其它(非常量)對象一樣工作,也就是說,只在一個文件中定義const,而在其它多個文件中聲明
并使用它。解決的辦法是,對于const變量不管是聲明還是定義都添加extern關(guān)鍵字,這樣只需定義一次就可以了
*/
extern const int bufsize = fcn();int test_extern_1()
{extern int i; // 聲明i而非定義iint j; // 聲明并定義j//extern double pi = 3.1415; // 定義,在函數(shù)體內(nèi)部,如果試圖初始化一個由extern關(guān)鍵字標(biāo)記的變量,將引發(fā)錯誤return 0;
}int test_extern_2()
{fprintf(stdout, "blob addr: %s\n", extern_variable_blog_addr.c_str());fprintf(stdout, "github addr: %s\n", extern_variable_github_addr.c_str());fprintf(stdout, "a + b = %d\n", extern_function_add(2, 3));fprintf(stdout, "name: %s\n", extern_function_name().c_str());return 0;
}} // namespace extern_
extern2.hpp:

#ifndef FBC_CPPBASE_TEST_EXTERN2_HPP_
#define FBC_CPPBASE_TEST_EXTERN2_HPP_#include <string>extern std::string extern_variable_blog_addr;
extern std::string extern_variable_github_addr;
extern int extern_function_add(int a, int b);
extern const std::string extern_function_name();#endif // FBC_CPPBASE_TEST_EXTERN2_HPP_
extern2.cpp:

#include "extern2.hpp"std::string extern_variable_blog_addr{ "http://blog.csdn.net/fengbingchun" };
std::string extern_variable_github_addr{ "https://github.com/fengbingchun" };int extern_function_add(int a, int b)
{return (a + b);
}extern const std::string extern_function_name()
{return "C++";
}

GitHub:? https://github.com/fengbingchun/Messy_Test?

總結(jié)

以上是生活随笔為你收集整理的C++中extern的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。