?我對(duì)動(dòng)手寫(xiě)一些大的程序很有抵觸心理,可能是初學(xué)的原因,但是已經(jīng)是大二了,應(yīng)該不算初學(xué)。
我們學(xué)校不是名校,而且地理環(huán)境比較偏僻。信息量自然就閉塞,我只能通過(guò)協(xié)議感想與外界交流。希望大家多多幫助。
我沒(méi)有好好思考過(guò)一個(gè)大型的程序應(yīng)該具備什么樣的素質(zhì)。只是下手寫(xiě)的時(shí)候覺(jué)得無(wú)所適從。我覺(jué)得不光是自己的編程能力有限,和自己的不勤于與人交流有關(guān)系。我總是閉門造車。不停遇到困難,有時(shí)候會(huì)去調(diào)試,有時(shí)候干脆就放在那,問(wèn)題就一直沒(méi)有解決。
首先對(duì)這本書(shū)上的最開(kāi)始的設(shè)計(jì)原則的幾個(gè)連接解釋,引用一段文章
對(duì)象、引用、函數(shù)、類型、模板和命名空間被統(tǒng)稱為識(shí)別名稱。每個(gè)識(shí)別名稱都有三種連接類型:外部連接,內(nèi)部連接和無(wú)連接。這些連接類型都規(guī)定了它在其他范圍以及轉(zhuǎn)譯單元中的可見(jiàn)性。
識(shí)別名稱的外部連接和程序的每個(gè)編譯單元都有聯(lián)系。比如:函數(shù)通常不被定義為靜態(tài)的全局對(duì)象,常量對(duì)象可以定義為枚舉類型等等。
下面列舉了一些識(shí)別名稱的外部連接方式:
?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
識(shí)別名稱的內(nèi)部連接僅存在于編譯單元的定義中。在一個(gè)命名空間中定義一個(gè)靜態(tài)對(duì)象,那么這個(gè)命名空間的連接類型就是內(nèi)部連接。匿名連接的成員、匿名命名空間的成員、typedef類型名,或者常量變量是不能定義成外部的。
下面舉例說(shuō)明識(shí)別名稱的內(nèi)部連接方式:
? 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
無(wú)連接方式僅存在于識(shí)別名稱被定義的范圍。這些識(shí)別名稱包括局部對(duì)象、局部類和局部類型。此外,不管識(shí)別名稱是內(nèi)部連接還是外部連接,它們都是無(wú)連接。
下面舉例說(shuō)明無(wú)連接方式:
? 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
}
現(xiàn)在,我們可以利用不同的連接方式確定識(shí)別名稱在不同范圍和編譯單元中的可見(jiàn)性了。
書(shū)中說(shuō)到內(nèi)部連接和外部連接
當(dāng)一個(gè).cpp文件編譯時(shí),C預(yù)處理器(cpp)首先(遞歸地)包含頭文件,形成一個(gè)含有所有必要信息的單個(gè)源文件。然手這個(gè)中間文件(成為“編譯單元”)被編譯生成一個(gè)與主文件名相同的.obj文件(目標(biāo)文件)。連接把在不同編譯單元中產(chǎn)生的符號(hào)聯(lián)系起來(lái),構(gòu)成一個(gè)可執(zhí)行程序。這就包含兩種不同的連接:外部連接和內(nèi)部連接。
內(nèi)部連接的定義:如果一個(gè)名稱對(duì)于它的編譯單元來(lái)說(shuō)是局部的,并卻在連接是不可能與其它編譯單元中的同樣的名稱相沖突,那么這個(gè)名稱由內(nèi)部連接。
內(nèi)部連接意味著對(duì)這個(gè)定義的訪問(wèn)被局限于當(dāng)前編譯單元中。對(duì)其他單元都不可見(jiàn)。
反之,可以定義外部連接,就是這個(gè)名稱在連接時(shí)可以和其他編譯單元交互。
現(xiàn)在明白為什么有連接錯(cuò)誤的時(shí)候會(huì)提示 使用了非法的外部連接。
be?continued……
?