鏈接性是程序編譯時(shí),程序中的名字(name,也可稱標(biāo)識(shí)符identifier)在作用域中不同位置的出現(xiàn)能夠綁定到同一對(duì)象或函數(shù)。C++語(yǔ)言中,鏈接性描述了名字在整個(gè)程序或單獨(dú)編譯單元中能否綁定到同一實(shí)體(entity)。
變量的鏈接性鏈接性(linkage)描述了名稱如何在不同單元間共享。鏈接性為外部的名稱,可在文件間共享,連接性為內(nèi)部的名稱,只能由一個(gè)文件中的函數(shù)共享。自動(dòng)變量的名稱沒(méi)有鏈接性,因?yàn)樗荒芄蚕怼?/p>
鏈接性為外部的變量,通常簡(jiǎn)稱為外部變量,它們的存儲(chǔ)持續(xù)性為靜態(tài),作用域?yàn)檎麄€(gè)文件。
靜態(tài)鏈接性靜態(tài)鏈接性(static linkage)也稱為內(nèi)部鏈接性(internal linkage)。static關(guān)鍵字在C/C++中限定名字在一個(gè)函數(shù)內(nèi)或一個(gè)編譯單元內(nèi)可見。(C++ 98/C++03廢棄這一用法,用匿名命名空間取代。但C++11又恢復(fù)了這一用法)。
C++隱式把具有const限定的命名空間中的變量處理為內(nèi)部鏈接性,除非在const限定聲明之時(shí)或之前已經(jīng)聲明為extern。這與C語(yǔ)言完全不同。
具有內(nèi)部鏈接性的:
所有的聲明
命名空間(包括全局命名空間)中的靜態(tài)自由函數(shù)、靜態(tài)友元函數(shù)、靜態(tài)變量的定義、const常量定義
enum定義
inline函數(shù)定義(包括自由函數(shù)和非自由函數(shù))
類(class、struct、union)的定義
具有內(nèi)部鏈接性的名字,在編譯后不會(huì)產(chǎn)生鏈接符號(hào)(或者稱修飾名字),因此不與鏈接器打交道。
外部鏈接性外部鏈接性(external linkage)也稱為全局鏈接性(global linkage)。具有全局鏈接性的名字可以在不同編譯單元聲明并綁定到同一實(shí)體。1
具有外部鏈接性的:
非inline函數(shù)。包括命名空間中非靜態(tài)函數(shù)、類成員函數(shù)和類靜態(tài)成員函數(shù)
類靜態(tài)成員變量總有外部鏈接。
命名空間(不包括無(wú)名命名空間)中非靜態(tài)變量
無(wú)鏈接性無(wú)鏈接性(no linkage)的名字具有局部作用域。如局部變量、函數(shù)形參等。
跨語(yǔ)言鏈接不同編程語(yǔ)言對(duì)同一名字編譯后得到的修飾名字可能不同。為了讓C++語(yǔ)言寫的程序能使用C語(yǔ)言程序,需要使用extern "C"使得這段代碼可鏈接。
示例/* file demo1.c */ /* extern */ void foo(void); /* extern optional - it's the default */ int main(void){ foo(); return 0; }/* file demo2.c */ void foo(void){ /* ... */}函數(shù)的鏈接性在默認(rèn)情況下,函數(shù)的鏈接性為外部的,即可以在文件間共享。可以在函數(shù)原型中使用關(guān)鍵字extern來(lái)指出函數(shù)是在另一個(gè)文件中定義的,不過(guò)這是可選的。
可以使用關(guān)鍵字static將函數(shù)的鏈接性設(shè)置為內(nèi)部的,使之只能在一個(gè)文件中使用。必須同時(shí)在原型和函數(shù)定義中使用static關(guān)鍵字。
static int fn(double x); ...static int fn(double x){ ...}這意味著該函數(shù)只在這個(gè)文件中可見,還意味著可以在其他文件中定義同名的函數(shù)。和變量一樣,在定義靜態(tài)函數(shù)的文件中,靜態(tài)函數(shù)將覆蓋外部定義,因此,即使在外部定義了同名的函數(shù),該文件扔將使用靜態(tài)函數(shù)。
單定義規(guī)則也適用于非內(nèi)聯(lián)函數(shù),因此對(duì)于每個(gè)非內(nèi)聯(lián)函數(shù),程序只能包含一個(gè)定義。對(duì)于鏈接性味外部的函數(shù)來(lái)說(shuō),這意味著在多文件程序中,只能有一個(gè)文件包含該函數(shù)的定義,但使用該函數(shù)的每個(gè)文件都應(yīng)包含其函數(shù)原型。
內(nèi)聯(lián)函數(shù)不受這種規(guī)則的約束,這允許程序員能夠?qū)?nèi)聯(lián)函數(shù)的定義放在頭文件中,這樣包含了頭文件的每個(gè)文件都有內(nèi)聯(lián)函數(shù)的定義。然而,C++要求同一個(gè)函數(shù)的素有內(nèi)聯(lián)定義都必須相同。
所有聲明都具有外部鏈接性具有內(nèi)部連接性的定義名字空間(包括全局名字空間)中的靜態(tài)自由函數(shù),靜態(tài)友元函數(shù)、靜態(tài)變量定義,const常量定義;enum定義,類的定義,union的定義;inline函數(shù)定義(包括自由函數(shù)和非自由函數(shù))。
具有外部連接性的定義非inline的類成員函數(shù),非inline的類靜態(tài)函數(shù);類靜態(tài)成員變量;名字空間(包括全局名字空間)中非靜態(tài)自由函數(shù),非靜態(tài)友元函數(shù),非靜態(tài)變量。
本詞條內(nèi)容貢獻(xiàn)者為:
李岳陽(yáng) - 副教授 - 江南大學(xué)