我可以理解:
- UB 的起源之一是提高性能(例如,通過洗掉從未執行的代碼,例如
if (i 1 < i) { /* never_executed_code */ };UPD:如果i是有符號整數)。 - UB 可以在編譯時觸發,因為 C 沒有明確區分編譯時和運行時。“整個語言都基于“抽象機器”(鏈接)的(相當無用的)概念。
但是,我還不明白為什么 C 前處理器是未定義行為的主題?眾所周知,預處理指令是在編譯時執行的。
考慮 C11, 6.10.3.3 ## 運算子 3:
如果結果不是有效的預處理標記,則行為未定義。
為什么不讓它成為一個約束?例如:
結果應為有效的預處理令牌。
同樣的問題也適用于 6.10 預處理指令中的所有其他“行為未定義”。
uj5u.com熱心網友回復:
為什么 C 前處理器是未定義行為的主題?
在創建 C 標準時,有一些現有的 C 前處理器,并且在標準化委員會成員的腦海中存在一些想象中的理想 C 前處理器。
所以有這些灰色區域,委員會成員不完全確定他們想要做什么和/或現有的 C 前處理器實作在行為上彼此不同。
因此,這些情況不是定義的行為。因為 C 委員會成員并不完全確定實際應該是什么行為。所以對它應該是什么沒有要求。
UB的起源之一
是的,其中之一。
UB 的存在可能是為了簡化語言的實作。例如,在前處理器的情況下,前處理器撰寫者不必關心當無效的前處理器令牌是##.
或者 UB 可能存在以協調具有不同行為的現有實作或作為擴展點。因此,在 UB 情況下會出現段錯誤的前處理器,在 UB 情況下接受并作業的前處理器,以及在 UB 情況下格式化硬碟驅動器的前處理器,都可以符合標準(但我不想作業)格式化驅動器的一種)。
uj5u.com熱心網友回復:
在不深入細節的情況下,我的猜測是,存在幾個存在錯誤的前處理器實作,但出于兼容性原因,標準不想宣告它們不符合標準。
在人類語言中:如果你撰寫一個包含 X 的程式,前處理器會做一些奇怪的事情。
在標準語言中:帶有 X 的程式的行為是未定義的。
如果標準說“結果應為有效的預處理令牌”之類的內容,則可能不清楚“應”在此背景關系中的含義。
- 程式員應該撰寫程式以使這個條件成立?如果是這樣,“未定義行為”的措辭更清晰,更統一(它也出現在其他地方)
- 前處理器應確保此條件成立?如果是這樣,這需要專門的邏輯來檢查條件;實施起來可能不切實際。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410354.html
標籤:
上一篇:讀取和列印矩陣
