C 內部連線和外部連線

2021-06-08 14:53:50 字數 1680 閱讀 7775

**:

內部連線:假如乙個名稱對於他的編譯單元來說是區域性的,並且在連線時不會和其他編譯單元中的同樣的名稱相衝突,那麼這個名稱有內部連線(注:有時也將宣告看作是無連線的,這裡我們統一看成是內部連線的)。

以下情況有內部連線:

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...