C語言國際標準 ISO/IEC 9899:1999(E) 翻譯(四):庫 (轉)

gugu99發表於2007-08-16
C語言國際標準 ISO/IEC 9899:1999(E) 翻譯(四):庫 (轉)[@more@]

C語言國際標準 ISO/IEC 9899:1999(E) 翻譯(四):庫

  By  RiverTime

 :namespace prefix = o ns = "urn:schemas--com::office" />

7.1.2 標準頭

1  宣告的每一個庫, 包括其原型, 標頭檔案。【注153:標頭檔案不必是一個原始檔,標頭檔案名字中在'< ' 和 '>' 之間的字元序列也不必是合法的原始檔名】 標頭檔案的內容透過 #include 預處理指示提供。標頭檔案宣告瞭一個相關函式集,必要的型別和宏定義。在此條款中描述的宣告型別不應當包括型別限定,除非在別的地方明確規定。

2  標準標頭檔案如下:



3  如果一個檔案與上面提到的'' 界定序列同名,不作為實現的一部分提供,被放在用來搜尋已包含的原始檔的任何標準的地方,此行為不被定義。

4  標準標頭檔案可以以任何順序包含;在給定的範圍內每個標頭檔案可以不止一次被包含,與僅包含一次的效果沒有什麼不同,但是包含依賴於NDE 定義的 檔案是例外(請看 7.2)。標頭檔案應當在任何外部宣告或定義之外被包含,也應當在它所宣告的任何函式或,所定義的任何型別或宏的第一次被引用之前被包含。然而,如果識別符號在多於一個標頭檔案中宣告或定義,第二及以後的相關標頭檔案允許在識別符號的初始引用之後被包含。不應當有任何宏名字和包含之前定義的關鍵字相同。

5  任何在此條款中描述的與物件相似的宏的定義應當展開成被圓括號完全保護的程式碼,這樣它在任意一箇中聚合,就好像它是一個單一的識別符號。

6  庫函式的任何宣告應當有相應的外部連結。

7  在附錄B中給出了標準標頭檔案內容概要。進一步的參考請看:診斷(7.2)。

7.1.3 保留識別符號

1  每個標頭檔案宣告或定義了在其相關的子條款中列出的所有識別符號,同時有選擇地宣告或定義了在其相關的將來庫方向子條款中列出的所有識別符號,以及那些要麼是為其他任何用處要麼是為檔案範圍內識別符號而一直保留的識別符號。

——所有以下劃線和緊接著一個大寫字母或另一個下劃線開始的識別符號總是保留。

——所有以下劃線開始的識別符號總是保留,用於普通和標籤名字空間的檔案作用域識別符號。

——在任何以下子條款(包括將來庫方向)中的每一宏名字保留用來指定其相關的任何標頭檔案是否被包含;除非另外明確規定(請看 7.1.4)。

——所有在以下的任何一個子條款(包括將來庫方向)中有外部連結的識別符號總是保留,用於作為外部連結的識別符號。

【注 154: 外部連結的保留識別符號包括 error,setjmp 和va_end。】

——在以下列出的任何子條款(包括將來庫方向)中列出的每一個檔案作用域識別符號保留,用於宏名字,同時也用於在同一名字空間中的檔案作用域識別符號,如果其相應的任何標頭檔案被包含的話。

2  其它的識別符號不被保留。 如果程式宣告或定義一個在某個上下文中被保留的識別符號(不同於隨後的7.1.4),或者定義一個保留識別符號為一個宏名字, 其行為不定義。

3  如果一個程式刪除(透過 #undef)了以上所列的識別符號的任何宏定義, 其行為不定義。

7.1.4 庫函式的使用

1  以下陳述的每一點都適用,除非另外有如下所詳細描述的明確宣告:如果傳給函式的引數值不合法(例如,值在函式的作用域之外,或者指標在程式的地址空間之外,或者空指標,或者指標指向不可寫而對應的引數不限定為常量 ),或者一個型別(向上轉換之後)不符合帶可變引數數目函式的定義,此行為不定義。如果函式引數描述為一個陣列,則實際傳給函式的指標應當是一個地址計算和訪問物件都真正合法的值(如果該指標真的指向陣列的第一個元素,則其是合法的)。在標頭檔案中定義的任何函式,可能會以在標頭檔案中定義的函式樣的宏再次實現,所以如果庫函式透過包含標頭檔案被明確宣告,以下技術之一可用於保證宣告不受這樣的宏的影響。函式的任何宏定義可透過用圓括號括住函式名的辦法被區域性禁止,因為此時名字後面不再跟著指示宏函式名展開的左圓括號。同樣,允許獲得庫函式的地址即使其也是定義為一個宏。【注 155】 用  #undef 遮蔽宏定義同時也確保了實際函式的引用。用宏實現的庫函式的任何應當展開為每個引數只算一次的程式碼,而且在需要時用圓括號保護,所以使用任意表示式作為引數通常是的【注 156】。同樣,那些在以下子條款中描述的函式樣的宏可以在表示式中呼叫,無論在何處帶有一致返回型別的函式可以被呼叫【注 157】。所有列出的展開成整型常量表示式物件這樣的宏應當在 #if 預處理指示中適用。

2  如果庫函式宣告時不引用在某個標頭檔案裡定義的型別,則允許宣告並使用該函式時不包含其對應的標頭檔案。

3  在庫函式返回之前,有一順序點。

4  不擔保標準庫的函式是可重入的,它可能修改靜態域裡的物件。  【注158】

【注 155】這意味著一個實現應當為每一個庫函式提供一個實際的函式,儘管它

也為該函式提供一個宏。

【注 156】這樣的宏可能不包括順序點,而其對應的函式呼叫包括。

【注 157】 因為以下劃線開始的外部識別符號和一些宏名字是保留的,實現可以

為這些名字提供特殊的語義。例如,識別符號_BUILTIN_abs 可用於指示abs 函式

內聯碼的產生。所以, 適當的標頭檔案可以為指定

#define abs(x) _BUILTIN_abs(x)

編譯器的程式碼產生器會接收它。據此,如果使用者想保證像abs 這樣的庫函式是真正的函式可以這樣寫:

 #undef abs

不管實現標頭檔案提供abs的宏實現還是內建的實現。被宏定義提前和隱藏的函式原型因此也暴露出來了。

【注 158】 因此,一個訊號處理者通常不能呼叫標準庫函式。

5 例

函式 atoi 可以有以下幾種用法:

——用其相應的標頭檔案(很可能生成一個宏表示式)

#include

const char *str;

/* ... */

i = atoi(str);

——用其相應的標頭檔案(一定是生成一個真正的函式引用)

#include

#undef atoi

const char *str;

/* ... */

i = atoi(str);

或者

#include

const char *str;

/* ... */

i = (atoi)(str);

——明確宣告

extern int atoi(const char *);

const char *str;

/* ... */

i = atoi(str);


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-961033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章