識別符號範圍
識別符號的範圍即程式所能「看到」識別符號的部分,範圍的型別通常由你宣告變數的地方決定(除過標籤,它往往具有函式範圍),下面是四種可能的範圍:
檔案域:
如果你在所有的程式塊和引數列表這外宣告了乙個識別符號,那麼它將具有檔案域,宣告之後在任意地方使用它直到翻譯單元結束。
塊域:除過標籤,在塊中宣告的識別符號具有塊域,你只能在宣告它的最小塊域中使用它,最小塊域通常為乙個函式的函式體,在c99
中,宣告不必放在函式塊的最前面,在乙個函式中定義的引數名也具有塊域,在函式體中有效。
函式原型域:
函式原型中的引數名具有函式原型域,因為這些引數名在原型外沒有意義,它們往往用做注釋,可被忽略。
函式域:
標籤的範圍通常為它所出現在函式塊,即使它出現在巢狀的塊中,換句話說,你可以使用goto
語句跳到同一函式中任意具有此標籤的地方(
跳進乙個巢狀的塊中是個不好的主意)。
乙個識別符號的範圍從它定義之後就開始,但是,結構體,標籤,聯合體、列舉型別和列舉常量是個例外,它們的範圍在宣告出現後即開始,所以它們可以在宣告本身中再次引用,下面的為乙個結構體型別的宣告,最後乙個成員為結構next,
是乙個剛宣告的結構的指標:
struct node ; // define a structure type void printnode( const struct node *ptrnode); // declare a function int printlist( const struct node *first ) // begin a function definition }
在這個**段中,識別符號node, next, printnode 和printlist均有檔案域,引數ptrnode具有檔案原型域,變數first和ptr具有塊域。
在乙個巢狀中,可以宣告乙個外部已經宣告的識別符號,,即使新識別符號名稱相同,如果你這樣做,新識別符號將有塊或函式原型域,且塊域或函式原型域將是一外層域的真子集,在這種場景下,內部識別符號隱藏了外部的宣告,所以外部宣告的變數或函式在內部是不可見的,例如,下面的宣告是請允許的:
double x; // declare a variable x with file scope long calc( double x ); // declare a new x with function prototype scope int main( ) x *= 2; // here x refers to the long variable again /*...*/ }
在本例中,long
型別的變數x
宣告在main()
中,隱藏了double
型別的變數x,
因此,在main()
中沒有辦法直接訪問double
型別的變數x
,此外,if
條件塊中,float
型變數x
又隱藏了long
型別的變數x。
C核心技術手冊(二)
組成c 程式的 積木 叫做函式,每個函式都有自己的用途,並且可以相互呼叫。每個函式包含可被執行的語句,而這些語句可以分組,從而形成語句塊。做為程式設計師,你可以直接使用 c標準庫的的函式,也可以自己編寫函式來實現既定目的。除此之外,還有很多專用的庫可以使用,例如圖形函式庫。然而,使用這些非標準庫,會...
C核心技術手冊(四)
在原始碼中應該使用注釋來說明程式,在 c語言中,有兩種插入注釋的方法 塊注釋使用 表示 開始,表示結束 行注釋使用 開始,直到此行結尾。你可以使用分割符 和 在一行中開始和結束注釋,並可以巢狀注釋在多行中,例如,在下面的函式原型中,省略號 表示 open 函式有第三個可選引數,注釋解釋此引數的使用方...
C核心技術手冊(七)
通用字元名 c也支援通用字元名來使用擴充套件字符集,使用通用字元名,你可以指定任何擴充套件字元,它的 unicode 值如下形式 u x 或者 u xx 其中,x 或 xx為16 進製的unicode 指標符號,使用小寫字母 u做為字首,後面為四個十六進製制數字,或者大寫字母 u,後面為 8個十六進...