實現定義的行為
概述
C 標準描述了語言語法,標準庫提供的功能,以及符合 C 處理器(粗略地說,編譯器)和符合 C 程式的行為。就行為而言,大多數標準規定了程式和處理器的特定行為。另一方面,某些操作具有顯式或隱式的未定義行為 - 總是要避免這種操作,因為你不能依賴於它們的任何內容。在這兩者之間,存在各種實現定義的行為。這些行為可能因 C 處理器,執行時和標準庫(統稱為實現) 而異 ** ),但它們對於任何給定的實現都是一致和可靠的,並且符合實現的文件記錄了它們在這些領域中的每一個。
程式依賴於實現定義的行為有時是合理的。例如,如果程式無論如何都是特定於特定操作環境的,那麼依賴於實現定義的行為通常對於該環境的公共處理器來說不太可能成為問題。或者,可以使用條件編譯指令來選擇適合於正在使用的實現的實現定義的行為。在任何情況下,必須知道哪些操作具有實現定義的行為,以便避免它們或者是否以及如何使用它們做出明智的決定。
這些評論的平衡構成了 C2011 標準中規定的所有實施定義的行為和特徵的列表,並參考了該標準。他們中的許多人使用標準的術語 。其他一些更普遍地依賴於標準的上下文,例如將原始碼轉換為程式的八個階段,或託管和獨立實現之間的差異。可能特別令人驚訝或值得注意的一些以粗體字型呈現。並非所有描述的行為都受到早期 C 標準的支援,但一般來說,它們在支援它們的所有標準版本中都具有實現定義的行為。
程式和處理器
一般
來源翻譯
-
物理原始檔多位元組字元對映到源字符集( 5.1.1.2/1 )的方式。
-
在翻譯階段 3( 5.1.1.2/1 ) 期間,非換行空格的非空序列是否被單個空格替換
-
字串常量中的字元文字和字元轉換的執行集字元(在轉換階段 5 期間),否則沒有相應的字元( 5.1.1.2/1 )。
操作環境
-
確定要發出的診斷訊息的方式( 5.1.1.3/1 )。
-
在獨立實現( 5.1.2.1/1 ) 中啟動時呼叫的函式的名稱和型別。
-
在指定的最小集合( 5.1.2.1/1 ) 之外的獨立實現中可以使用哪些庫工具。
-
程式終止在獨立環境中的影響( 5.1.2.1/2 )。
-
在託管環境中,除
int main(int argc, char *arg[])
和int main(void)
( 5.1.2.2.1 / 1 ) 之外的main()
功能的任何允許簽名。 -
託管實現定義
main()
( 5.1.2.2.1 / 2 ) 的第二個引數指向的字串的方式。 -
為了第 5.1.2.3 節 (程式執行)和 7.21.3 (檔案)( 5.1.2.3/7 ) 的目的,什麼構成互動裝置 。
-
對優化實現( 5.1.2.3/10 ) 中的中斷處理程式例程引用的物件的任何限制。
-
在獨立實現中,是否支援多個執行執行緒( 5.1.2.4/1 )。
-
執行字符集成員的值( 5.2.1 / 1 )。
-
char
值對應於定義的字母轉義序列( 5.2.2 / 3 )。 -
整數和浮點數字限制和特徵 ( 5.2.4.2/1 )。
-
浮點算術運算的準確性以及標準庫從內部浮點表示到字串表示的轉換( 5.2.4.2.2 / 6 )。
-
巨集
FLT_ROUNDS
的值,它編碼預設的浮點舍入模式( 5.2.4.2.2 / 8 )。 -
圓形行為的特徵是
FLT_ROUNDS
的支援值大於 3 或小於 -1( 5.2.4.2.2 / 8 )。 -
巨集
FLT_EVAL_METHOD
的值,它表徵浮點評估行為( 5.2.4.2.2 / 9 )。 -
行為的特徵是任何支援的
FLT_EVAL_METHOD
值小於 -1(5.2.4.2.2 / 9 )。 -
巨集
FLT_HAS_SUBNORM
,DBL_HAS_SUBNORM
和LDBL_HAS_SUBNORM
的值,表徵標準浮點格式是否支援次正規數( 5.2.4.2.2 / 10 )
型別
-
嘗試(間接)從與該物件關聯的執行緒之外的執行緒訪問具有執行緒儲存持續時間的物件的結果( 6.2.4 / 4 )
-
已分配基本執行集之外的字元的
char
的值( 6.2.5 / 3 )。 -
支援的擴充套件有符號整數型別(如果有)( 6.2.5 / 4 )以及用於標識它們的任何擴充套件關鍵字。
-
char
是否具有與signed char
或unsigned char
( 6.2.5 / 15 ) 相同的表示和行為。可以用CHAR_MIN
查詢,如果char
未簽名或簽名,則分別為0
或SCHAR_MIN
。 -
物件表示中位元組的數量,順序和編碼,除非標準明確指定( 6.2.6.1/2 )。
-
在任何給定情況下,三種公認的整數表示形式中的哪一種適用,以及整數物件的某些位模式是否是陷阱表示 ( 6.2.6.2/2 )。
-
每種型別的對齊要求( 6.2.8 / 1 )。
-
是否支援以及在何種情況下支援任何擴充套件比對( 6.2.8 / 3 )。
-
任何擴充套件有符號整數型別相對於彼此的整數轉換等級( 6.3.1.1/1 )。
-
將超出範圍的值分配給有符號整數 ( 6.3.1.3/3 )的效果。
-
當在範圍內,但不可表示的值被分配到一個浮點物件,如何儲存在物件可表示的值是從所述兩個最接近的可表示的值(選擇之間 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 )。
-
將整數轉換為指標型別的結果,但值為
0
( 6.3.2.3/5 )的整數常量表示式除外。
來源表格
-
#pragma
指令中識別標題名稱標記的位置( 6.4 / 4 )。 -
字元,包括多位元組字元,下劃線,非重音拉丁字母,通用字元名稱和可能出現在識別符號中的十進位制數字( 6.4.2.1/1 )。
-
識別符號中的重要字元數 ( 6.4.2.1/5 )。
-
除了一些例外,整數字符常量中的源字元對映到執行集字元的方式( 6.4.4.4/2 ; 6.4.4.4/10 )。
-
當前區域設定用於計算寬字元常量的值,以及許多此類常量的轉換的大多數其他方面( 6.4.4.4/11 )。
-
是否可以連線帶有不同字首的寬字串文字標記,如果是,則處理生成的多位元組字元序列( 6.4.5 / 5 )
-
在轉換階段 7 期間使用的語言環境將寬字串文字轉換為多位元組字元序列,以及當結果在執行字符集中無法表示時的值( 6.4.5 / 6 )。
-
標題名稱對映到檔名的方式( 6.4.7 / 2 )。
評估
-
不使用
FP_CONTRACT
時是否以及如何收縮浮點表示式( 6.5 / 8 )。 -
sizeof
和_Alignof
運算子的結果值 ( 6.5.3.4/5 )。 -
指標減法的結果型別的大小( 6.5.6 / 9 )。
-
右移有符號整數的結果為負值 ( 6.5.7 / 5 )。
執行時行為
-
register
關鍵字有效的程度( 6.7.1 / 6 )。 -
宣告為
int
的位域型別是否與unsigned int
或signed int
( 6.7.2 / 5 )的型別相同。 -
除了可選合格的
_Bool
,signed int
和unsigned int
之外,還有哪些型別的位域可以採用; 位域是否可能具有原子型別( 6.7.2.1/5 )。 -
關於實現如何佈局位域儲存的方面( 6.7.2.1/11 )。
-
結構和聯合的非位域成員的對齊( 6.7.2.1/14 )。
-
每種列舉型別的基礎型別( 6.7.2.2/4 )。
-
是什麼構成了對天賦資格物件的訪問( 6.7.3 / 7 )。
-
inline
函式宣告的有效性( 6.7.4 / 6 )。
前處理器
-
字元常量是否在前處理器條件中以與普通表示式相同的方式轉換為整數值,以及單字元常量是否可能具有負值( 6.10.1 / 4 )。
-
這些位置搜尋了
#include
指令( 6.10.2 / 2-3 )中指定的檔案。 -
從多標記
#include
指令( 6.10.2 / 4 ) 的標記形成標題名稱的方式。 -
#include
巢狀的限制( 6.10.2 / 6 )。 -
是否在
\
之前插入了\
字元,在前處理器的#
運算子( 6.10.3.2/2 ) 的結果中引入了通用字元名稱。 -
除
STDC
( 6.10.6 / 1 ) 之外的 pragma 的#pragma
預處理指令的行為。 -
如果沒有翻譯日期或時間,則
__DATE__
和__TIME__
巨集的值可用( 6.10.8.1/1 )。 -
如果未定義巨集
__STDC_ISO_10646__
,則用於wchar_t
的內部字元編碼( 6.10.8.2/1 )。 -
如果未定義巨集
__STDC_UTF_32__
,則用於char32_t
的內部字元編碼( 6.10.8.2/1 )。
標準庫
一般
- 斷言失敗時發出的訊息格式( 7.2.1.1/2 )。
浮點環境功能
-
除標準( 7.6 / 6 ) 定義之外的任何其他浮點異常。
-
任何額外的浮點舍入模式超出標準( 7.6 / 8 ) 定義的模式。
-
除標準( 7.6 / 10 ) 定義的任何其他浮點環境。
-
浮點環境訪問開關的預設值( 7.6.1 / 2 )。
-
由
fegetexceptflag()
( 7.6.2.2/1 ) 記錄的浮點狀態標誌的表示。 -
feraiseexcept()
函式是否會在引發溢位或下溢浮點異常( 7.6.2.3/2 ) 時另外引發不精確的浮點異常。
與區域設定相關的功能
setlocale()
支援的語言環境字串除了C
( 7.11.1.1/3 )。
數學函式
-
當
FLT_EVAL_METHOD
巨集具有與0
,1
和2
( 7.12 / 2 ) 不同的值時,由float_t
和double_t
表示的型別。 -
任何受支援的浮點分類超出標準( 7.12 / 6 ) 定義的分類。
-
math.h
返回的值在域錯誤( 7.12.1 / 2 ) 的情況下起作用。 -
當極點錯誤( 7.12.1 / 3 )時,
math.h
返回的值起作用。 -
當結果下溢時
math.h
返回的值,以及errno
是否設定為ERANGE
以及是否在這些情況下引發浮點異常的方面( 7.12.1 / 6 )。 -
FP 收縮開關的預設值( 7.12.2 / 2 )。
-
當第二個引數為 0( 7.12.10.1/3 ) 時,
fmod()
函式是返回 0 還是引發域錯誤。 -
當
remainder()
函式的第二個引數為 0( 7.12.10.2/3 ) 時,它是返回 0 還是引發域錯誤。 -
由
remquo()
函式( 7.12.10.3/2 ) 計算的商模數中的有效位數。 -
當
remquo()
函式的第二個引數為 0( 7.12.10.3/3 ) 時,它是返回 0 還是引發域錯誤。
訊號
-
完整的支援訊號集,它們的語義和預設處理( 7.14 / 4 )。
-
當引發訊號並且存在與該訊號相關聯的自定義處理程式時,在處理程式的執行期間( 7.14.1.1/3 ) 阻塞哪些訊號(如果有的話 )。
-
SIGFPE
,SIGILL
和SIGSEGV
以外的哪些訊號導致從自定義訊號處理程式返回時的行為未定義( 7.14.1.1/3 )。 -
最初配置哪些訊號被忽略(無論其預設處理如何; 7.14.1.1/6 )。
雜
- 巨集
NULL
擴充套件的特定空指標常量( 7.19 / 3 )。
檔案處理功能
-
文字流的最後一行是否需要終止換行符( 7.21.2 / 2 )。
-
自動附加到二進位制流的空字元數( 7.21.2 / 3 )。
-
以附加模式( 7.21.3 / 1 ) 開啟的檔案的初始位置。
-
是否在文字流上寫入會導致流被截斷( 7.21.3 / 2 )。
-
支援流緩衝( 7.21.3 / 3 )。
-
是否實際存在零長度檔案( 7.21.3 / 4 )。
-
組成有效檔名的規則( 7.21.3 / 8 )。
-
同一檔案是否可以同時開啟多次( 7.21.3 / 8 )。
-
多位元組字元編碼的性質和選擇( 7.21.3 / 10 )。
-
當目標檔案開啟時,
remove()
的行為將起作用( 7.21.4.1/2 )。 -
當目標檔案已存在時,
rename()
的行為( 7.21.4.2/2 )。 -
在程式異常終止的情況下,是否刪除通過
tmpfile()
函式建立的檔案( 7.21.4.3/2 )。 -
哪種模式在
freopen()
( 7.21.5.4/3 ) 允許的情況下發生變化。
I / O 功能
-
printf()
- 族函式( 7.21.6.1/8 ) 產生哪些允許的無限和非數字 FP 值的表示。 -
printf()
-family 函式( 7.21.6.1/8 ) 格式化指標的方式。 -
當
-
字元出現在[
欄位的掃描列表的內部位置時,scanf()
-family 的行為起作用( 7.21.6.2/12 )。 -
scanf()
家族的大部分方面都是為了處理p
領域( 7.21.6.2/12 )。 -
fgetpos()
在失敗時設定的errno
值( 7.21.9.1/2 )。 -
fsetpos()
在失敗時設定的errno
值( 7.21.9.3/2 )。 -
ftell()
設定的errno
值失敗( 7.21.9.4/3 )。 -
關於 NaN 格式的一些支援方面的
strtod()
-family 函式的含義( 7.22.1.3p4 )。 -
當結果下溢時,
strtod()
-family 函式是否將errno
設定為ERANGE
( 7.22.1.3/10 )。
記憶體分配功能
- 當請求的位元組數為 0( 7.22.3 / 1 ) 時,記憶體分配功能的行為。
系統環境功能
-
執行什麼清理(如果有)以及在呼叫
abort()
函式時返回到主機 OS 的狀態( 7.22.4.1/2 )。 -
呼叫
exit()
時,主機環境返回什麼狀態( 7.22.4.4/5 )。 -
呼叫
_Exit()
時,開啟流的處理以及返回主機環境的狀態( 7.22.4.5/2 )。 -
可通過
getenv()
訪問的環境名稱集和改變環境的方法( 7.22.4.6/2 )。 -
system()
函式的返回值( 7.22.4.8/3 )。
日期和時間功能
-
當地時區和夏令時( 7.27.1 / 1 )。
-
時間範圍和精度可通過
clock_t
和time_t
( 7.27.1 / 4 ) 型別表示。 -
時代的開始,作為
clock()
函式返回的時間的參考( 7.27.2.1/3 )。 -
作為
timespec_get()
函式返回的時間的參考的時期的開始(當時基是TIME_UTC
; 7.27.2.5/3 )。 -
strftime()
替換C
語言環境中的%Z
轉換說明符( 7.27.3.5/7 )。
寬字元 I / O 功能
-
wprintf()
系列函式( 7.29.2.1/8 ) 生成了無限和非數字 FP 值的哪些允許表示。 -
wprintf()
-family 函式( 7.29.2.1/8 ) 格式化指標的方式。 -
當
-
字元出現在[
欄位的掃描列表的內部位置時,wscanf()
-family 的行為起作用( 7.29.2.2/12 )。 -
wscanf()
家族的大多數方面都在處理p
領域( 7.29.2.2/12 )。 -
關於 NaN 格式的一些支援方面的
wstrtod()
-family 函式的含義( 7.29.4.1.1 / 4 )。 -
當結果下溢時,
wstrtod()
-family 函式是否將errno
設定為ERANGE
( 7.29.4.1.1 / 10 )。