C語言的連結屬性的個人理解
C語言有3個連結屬性:extern(外部)、intern(內部)、none(無)。
屬於extern的識別符號無論宣告幾次,都表示幾個原始檔中或整個專案中同一個實體。
屬於intern的識別符號在一個原始檔中的多個宣告都表示同一個實體。
屬於none的識別符號有幾個宣告就有幾個實體,相互獨立。
全域性變數預設擁有external連結屬性;
static修飾的變數擁有internal連結屬性;
函式體中的變數用於none連結屬性。
函式宣告時也預設擁有extern連結屬性。
已有連結屬性的變數再新增任何連結屬性都無效(宣告的時候就賦予了連結屬性?),保持原連結屬性,但對預設情況下是extern連結屬性的識別符號除外,加上static關鍵字,會將其從extern變為intern(被其所屬原始檔私有),函式同樣也可以這樣:static int a( int b )。宣告區域性變數後,使用的也不再是擁有extern連結屬性的變數,而是這個新宣告的變數(擁有extern連結屬性的變數仍然可以在區域性變數作用域外的其它地方呼叫,其它.c或.cpp檔案呼叫時只需宣告並加上extern即可如:extern int b; printf( "%d\n",b );)。
注意這裡用的定義和之前用的宣告,定義變數和宣告變數是不同的,定義變數編譯器需要給他分配記憶體單元,而宣告變數則不用,所以extern int a,此時的a表示別處的原始檔定義過的a。變數或函式可以多次宣告,但只能定義一次。
當變數在不同原始檔都用到時(也就是需要具有extern連結屬性),最好第一次宣告就用extern關鍵字,儘管預設也表示是extern連結屬性,這樣有利於程式碼的可讀性。
有一個技巧,在一個.h檔案宣告多個函式,可以在一個.c或.cpp檔案中對它們進行定義,在另一個.c或.cpp檔案中對他們進行呼叫。