**:
內部連線:假如乙個名稱對於他的編譯單元來說是區域性的,並且在連線時不會和其他編譯單元中的同樣的名稱相衝突,那麼這個名稱有內部連線(注:有時也將宣告看作是無連線的,這裡我們統一看成是內部連線的)。
以下情況有內部連線:
a)任何的宣告
b)名字空間(包括全域性名字空間)中的靜態自由函式、靜態友元函式、靜態變數的定義
c)enum定義
d)inline函式定義(包括自由函式和非自由函式)
e)類的定義
f)名字空間中const常量定義
g)union的定義
外部連線:在乙個多文件程式中,假如乙個名稱在連線時能夠和其他編譯單元互動,那麼這個名稱就有外部連線。
以下情況有外部連線:
a)類非inline函式總有外部連線。包括類成員函式和類靜態成員函式
b)類靜態成員變數總有外部連線。
c)名字空間(包括全域性名字空間)中非靜態自由函式、非靜態友元函式及非靜態變數
下面舉例說明:
a)宣告、enum定義、union定義有內部連線
任何的宣告、enum定義及union定義在編譯後不會產生連線符號,也就是在不同編譯單元中有相同名稱的宣告及enum、union定義並不會在連線時發生發現多個符號的錯誤。
typedef int int; //typedef 宣告,內部連線
enum color; //enum定義,內部連線
union x //union定義,內部連線
;int main(void)
typedef int int; //在a.cpp中重宣告乙個int型別別名,在連線時不會發生錯誤
enum color; //在a.cpp中重定義了乙個enum color,在連線時不會發生錯誤
const int i =blue; //const常量定義,內部連線
union x //union定義,內部連線
;
b)名字空間中靜態自由函式、靜態友元函式、靜態變數、const常量定義有內部連線
namespace test
//名字空間靜態函式定義,內部連線
}static int i = 0; //全域性靜態變數定義,內部連線
static int foo() //全域性靜態函式定義,內部連線
const int k = 0; //全域性const常量定義,內部連線
int main(void)
namespace test
//名字空間函式定義,外部連線
}int i = 0; //全域性變數定義,外部連線
int k = 0; //全域性變數定義,外部連線
int foo() //全域性函式定義,外部連線
在全域性名字空間中,main.cpp中定義了靜態變數i,常量k,及靜態自由函式foo等,這些都有內部連線。假如您將這些變數或函式的static或是const修飾符去掉,在連線時就會現multiply defined symbols錯誤,他們和a.cpp中的全域性變數、全域性函式發生衝突。 Oracle連線方式之等值連線和外部連線
oracle 8i,9i 表連線方法。一般的相等連線 select from a,b where a.id b.id 這個就屬於內連線。對於外連線 oracle中可以使用 來表示,9i可以使用left right full outer join left outer join 左外關聯 select...
內部類之 連線到外部類
我前一篇部落格開始,內部類似乎還只是一種名字隱藏和組織 的模式。這是是很有用,但還不是最引人注目的,它還有其它的用途。當生成乙個內部類的物件時,此物件與製造它的外圍物件之間就有了一種聯絡,所以它能訪問其外圍物件的所有成員,而不需要任何特殊的操作。此外,內部類還擁有其外圍類的所有元素的訪問權。inte...
Oracle表連線方式之等值連線 外部連線
oracle 8i,9i 表連線方法。一般的相等連線 select from a,b where a.id b.id 這個就屬於內連線。對於外連線 oracle中可以使用 來表示,9i可以使用left right full outer join left outer join 左外關聯 select...