關于《大規模C++程序設計》的一些感想(連載)
?我對動手寫一些大的程序很有抵觸心理,可能是初學的原因,但是已經是大二了,應該不算初學。
我們學校不是名校,而且地理環境比較偏僻。信息量自然就閉塞,我只能通過協議感想與外界交流。希望大家多多幫助。
我沒有好好思考過一個大型的程序應該具備什么樣的素質。只是下手寫的時候覺得無所適從。我覺得不光是自己的編程能力有限,和自己的不勤于與人交流有關系。我總是閉門造車。不停遇到困難,有時候會去調試,有時候干脆就放在那,問題就一直沒有解決。
首先對這本書上的最開始的設計原則的幾個連接解釋,引用一段文章
對象、引用、函數、類型、模板和命名空間被統稱為識別名稱。每個識別名稱都有三種連接類型:外部連接,內部連接和無連接。這些連接類型都規定了它在其他范圍以及轉譯單元中的可見性。
識別名稱的外部連接和程序的每個編譯單元都有聯系。比如:函數通常不被定義為靜態的全局對象,常量對象可以定義為枚舉類型等等。
下面列舉了一些識別名稱的外部連接方式:
?int n; //global non-static, hence external linkage
class C
{
?void f(); // member functions
?static int n;// static data members
};
extern const K; //defined in a different translation unit
void func ();
namespace NS
{
?class D{}; // qualified name NS::D has external linkage
}
enum DIR
{
?Up,
?Down
} // DIR, Up and Down have external linkage
識別名稱的內部連接僅存在于編譯單元的定義中。在一個命名空間中定義一個靜態對象,那么這個命名空間的連接類型就是內部連接。匿名連接的成員、匿名命名空間的成員、typedef類型名,或者常量變量是不能定義成外部的。
下面舉例說明識別名稱的內部連接方式:
? static void f(); //a static function
static int q; //a static object declared in global scope
namespace //members of anonymous namespace
{
?class C{};
?int x;
?}
const M=1000; //const object not declared extern
union{ //members of an anonymous union
?int x;
?float y;
};
typedefint I; // typedef names
無連接方式僅存在于識別名稱被定義的范圍。這些識別名稱包括局部對象、局部類和局部類型。此外,不管識別名稱是內部連接還是外部連接,它們都是無連接。
下面舉例說明無連接方式:
? int main()
{
?class C{}; // C is a local class; has no linkage
?int j; // local object not declared extern has no linkage
?C c;? // the object c has no linkage
?{
?//types declared in this scope aren't visible elsewhere
? enum Parity? // local enum and enumerators
? {
?? Even,
?? Odd
? };
? typedefint I; // local typedef
? I i; //OK
? Parity x=Odd; //OK
?}
?Parity x; //error, Parity isn't recognized in this scope
?I n; //ditto
}
現在,我們可以利用不同的連接方式確定識別名稱在不同范圍和編譯單元中的可見性了。
書中說到內部連接和外部連接
當一個.cpp文件編譯時,C預處理器(cpp)首先(遞歸地)包含頭文件,形成一個含有所有必要信息的單個源文件。然手這個中間文件(成為“編譯單元”)被編譯生成一個與主文件名相同的.obj文件(目標文件)。連接把在不同編譯單元中產生的符號聯系起來,構成一個可執行程序。這就包含兩種不同的連接:外部連接和內部連接。
內部連接的定義:如果一個名稱對于它的編譯單元來說是局部的,并卻在連接是不可能與其它編譯單元中的同樣的名稱相沖突,那么這個名稱由內部連接。
內部連接意味著對這個定義的訪問被局限于當前編譯單元中。對其他單元都不可見。
反之,可以定義外部連接,就是這個名稱在連接時可以和其他編譯單元交互。
現在明白為什么有連接錯誤的時候會提示 使用了非法的外部連接。
be?continued……
?