C++基礎(chǔ)(c++潛在作用域)

字號:

c/c++關(guān)于定義和聲明的原則是一次定義,多次聲明。定義分配了變量以及函數(shù)的內(nèi)存,而聲明則為這些變量和函數(shù)指定了一個引用標(biāo)簽,用來使用這些內(nèi)存,也就是名字。定義的使用是通過聲明(名字)來調(diào)用的。每個定義都有作用域(scope),潛在作用域(declaration region),鏈接性(linkage)和生存時間,據(jù)定義的實現(xiàn)而不同。重復(fù)定義錯誤往往是因為潛在作用域的交叉而引起的。
    生存時間是指定義的存活時間,有動態(tài),靜態(tài)和局部三種情況??荚嚧筇崾韭暶鳎郑┐婊顣r間依附于定義。動態(tài)的指在運行時從堆里動態(tài)申請內(nèi)存的變量(不包括函數(shù)類型,函數(shù)運行前已經(jīng)根據(jù)實現(xiàn)而決定了棧的大小);需要手動釋放,否則至死方休。靜態(tài)的指全局變量,函數(shù),和函數(shù)內(nèi)部用static限制的變量;存活時間為整個程序運行過程。局部指在函數(shù)運行時壓棧和彈棧的變量;在函數(shù)運行時存在。
    作用域(scope)指定義的聲明(名字)可以被使用的區(qū)域。在這個區(qū)域里面聲明(名字)必須且準(zhǔn)確的指向定義的內(nèi)存。否則會出現(xiàn)重定義錯誤。
    潛在作用域(declaration region)指定義的聲明(名字)可以被編譯器識別的區(qū)域,區(qū)域會因定義的鏈接性而不同,范圍覆蓋了作用域。在這個區(qū)域內(nèi)有些地方會因同名聲明被隱藏起來,內(nèi)鏈接定義的聲明會隱藏外鏈接定義的聲明,局部定義的聲明會隱藏內(nèi)鏈接定義的聲明和外鏈接定義的聲明。沒有隱藏的同名聲明會引發(fā)重定義錯誤。
    鏈接性指定義被其它單元(c++文件)識別(使用)的屬性。可以有外鏈接性,內(nèi)鏈接性和無鏈接性。外部鏈接性說明定義可以被其它單元識別,并可以通過extern在外部引用聲明,然后使用;此時定義的潛在作用域是全局的。內(nèi)鏈接性說明定義只能在本單元(一個C++文件)內(nèi)被識別;考試大提示潛在作用域是本單元。無鏈接性是指定義在函數(shù)內(nèi)部的靜態(tài)變量和局域變量的屬性;潛在作用域是本代碼塊。
    避免潛在作用域的同名聲明的沖突,有兩種辦法:1、定義的鏈接屬性改成內(nèi)部的,可用static限定,或者空namespace限定。2、使用命名空間,對聲明進行限定。
    另:const變量的默認(rèn)鏈接性為內(nèi)部的,函數(shù)和全局變量的默認(rèn)鏈接性為外部的。