【編程學(xué)習(xí)進(jìn)階之路】Extern和Export的作用及區(qū)別
在編程中,變量的聲明和定義是兩個(gè)重要的概念,它們?cè)诓煌闆r下有著不同的作用。本文將探討extern和export關(guān)鍵字的作用,以及它們之間的區(qū)別。
聲明與定義
在編程中,變量的聲明通常指的是告訴編譯器一個(gè)變量的存在,但不分配實(shí)際的內(nèi)存空間。而變量的定義則是在聲明的基礎(chǔ)上為變量分配內(nèi)存空間。這兩者的區(qū)別在于是否需要為變量分配存儲(chǔ)空間。
extern關(guān)鍵字
extern關(guān)鍵字通常用于聲明一個(gè)變量或函數(shù),告訴編譯器該變量或函數(shù)是在其他文件中定義的。這意味著變量的實(shí)際定義存在于其他地方,而當(dāng)前文件只是在這里引用它。例如,如果在一個(gè)C或C++程序中使用extern int a,那么編譯器會(huì)知道變量a是在另一個(gè)文件中定義的。
extern關(guān)鍵字通常用于引用全局變量或函數(shù),以實(shí)現(xiàn)跨文件的共享。這可以使程序更模塊化,減少代碼的重復(fù)編寫。
export關(guān)鍵字(C++中新增)
在C++中,出現(xiàn)了一個(gè)新的關(guān)鍵字export,它與extern有些相似,但用于模板的情況。export關(guān)鍵字用于實(shí)現(xiàn)模板函數(shù)的外部調(diào)用。在模板函數(shù)的實(shí)現(xiàn)時(shí),可以在其前面加上export關(guān)鍵字,這樣其他文件包含相應(yīng)的頭文件后就可以使用該模板。
export的主要作用是將模板的定義與實(shí)現(xiàn)分離,使得模板可以在不同的編譯單元中共享。這提供了更大的靈活性和可維護(hù)性,特別是在大型項(xiàng)目中。
extern "C"的用法
在C語言中,對(duì)于外部函數(shù)的聲明通常使用extern關(guān)鍵字,而C語言不支持extern "C"聲明。在C語言的頭文件中,只能將外部函數(shù)指定為extern類型,而不能使用extern "C"。如果在C文件中包含了extern "C",則會(huì)導(dǎo)致編譯語法錯(cuò)誤。
因此,extern "C"通常用于C++程序或其相關(guān)頭文件中,以便與C語言的函數(shù)進(jìn)行交互,確保函數(shù)的名稱和調(diào)用約定與C語言兼容。
在編程中,extern用于引用在其他文件中定義的變量或函數(shù),而export用于模板函數(shù)的外部調(diào)用,提供了更大的模塊化和可維護(hù)性。同時(shí),extern "C"用于與C語言函數(shù)進(jìn)行交互,確保兼容性。了解這些關(guān)鍵字的作用和用法可以幫助程序員更好地管理和組織代碼,使程序更加清晰和可維護(hù)。
explicit的作用
explicit阻止隱式轉(zhuǎn)換
隱式轉(zhuǎn)換
String s1 = "hello";
//進(jìn)行隱式轉(zhuǎn)換,等價(jià)于
String s1 = String("hello");
explicit阻止隱式轉(zhuǎn)換
class Test1
{
public:
Test1(int n){ num = n }
private:
int num;
}
class Test2
{
public:
explicit Test2(int n){ num = n }
private:
int num;
}
int main()
{
Test1 t1 = 1; //正確,隱式轉(zhuǎn)換
Test2 t2 = 1;//錯(cuò)誤,禁止隱式轉(zhuǎn)換
Test2 t2(1); //正確,可與顯示調(diào)用
}