連結性
連結性(linkage)是程序編譯時,程序中的名字(name,也可稱標識符identifier)在作用域中不同位置的出現能夠綁定到同一對象或函數。[1]C++語言中,連結性描述了名字在整個程序或單獨編譯單元中能否綁定到同一實體(entity)。
靜態連結性
編輯靜態連結性(static linkage)也稱為內部連結性(internal linkage)。static關鍵字在C/C++中限定名字在一個函數內或一個編譯單元內可見。(C++ 98/C++03廢棄這一用法,用匿名命名空間取代。但C++11又恢復了這一用法)。
C++隱式把具有const
限定的命名空間中的變量處理為內部連結性,除非在const
限定聲明之時或之前已經聲明為extern
。這與C語言完全不同。
具有內部連結性的:
- 所有的聲明
- 命名空間(包括全局命名空間)中的靜態自由函數、靜態友元函數、靜態變量的定義、const常量定義
- enum定義
- inline函數定義(包括自由函數和非自由函數)
- 類(class、struct、union)的定義
具有內部連結性的名字,在編譯後不會產生連結符號(或者稱修飾名字),因此不與連結器打交道。
外部連結性
編輯外部連結性(external linkage)也稱為全局連結性(global linkage)。具有全局連結性的名字可以在不同編譯單元聲明並綁定到同一實體。
具有外部連結性的:
- 非inline函數。包括命名空間中非靜態函數、類成員函數和類靜態成員函數
- 類靜態成員變量總有外部連結。
- 命名空間(不包括無名命名空間)中非靜態變量
無連結性
編輯無連結性(no linkage)的名字具有局部作用域。如局部變量、函數形參等。
跨語言連結
編輯不同程式語言對同一名字編譯後得到的修飾名字可能不同。為了讓C++語言寫的程序能使用C語言程序,需要使用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)
{
/* ... */
}
參考文獻
編輯- ^ ISO/IEC 9899 (頁面存檔備份,存於互聯網檔案館).C99語言標準官方文檔. As of 2007 the latest version of the standard is ISO/IEC 9899:TC3PDF (3.61 MiB)