[英]Why C language isn't Object Oriented language even though it has (Structures) struct keyword which is same as Class keyword of C++?
[英]In C++ why isn't “assert” a keyword?
現在“static_assert”是 C++0x 中的一個關鍵字,我認為用“assert”關鍵字替換 C“assert”宏也是合乎邏輯的。
static_assert 在編譯時被解釋,所以它必須是一個關鍵字,以便編譯器可以處理它。
assert 不需要是關鍵字,將其設為關鍵字也沒有多大意義,因為程序可能希望以多種方式響應斷言成功或失敗。 因此,在庫中實現它更有意義,它通常作為宏實現。
其他答案為您的問題提供了一些可能的答案,但最近的一項提議表明 assert 確實可能成為 C++17 中的關鍵字: https://isocpp.org/files/papers/N4154.Z437175BA4191210EE09ZE1D
assert
沒有編譯時意義,除了在預處理期間。 預處理器不了解 C++ 語言,因此關鍵字沒有意義。
相比之下, static_assert
在編譯時進行評估。 在這方面,將其作為關鍵字更有意義。 編譯器關心它的存在。
還有歷史原因; 它不是 C 中的關鍵字,並且在 C++ 中將其設為一個關鍵字會導致現有的斷言宏導致未定義的行為。
基本上,因為它不需要它。 運行時斷言的現有斷言機制非常好,不需要語言支持。
assert
可以在庫中實現,而static_assert
不能。 所以static_assert
得到一個關鍵字,因為它需要語言支持,而assert
不需要。
不能這樣做是為了與 c 中已經編寫的代碼兼容,該代碼具有 assert 作為變量名。 因此正如 oli 提到的,我們將無法編譯,因為 assert 不再是宏
在 C++0x 中(從這里開始):
在 C++0x 中,可以聲明 static 斷言以在編譯時檢測和診斷常見的使用錯誤。
這是static_assert
語法:
>>-static_assert--(--constant-expression--,--string-literal----->
其中constant-expression
必須根據上下文轉換為bool
。 如果它轉換為false
,那么編譯器將根據string-literal
發出錯誤。
所以,這基本上是需要關鍵字的語言的擴展。 它不是運行時機制。
再次來自上面鏈接的文檔:
在 C++ 語言中添加 static 斷言具有以下好處:
庫可以在編譯時檢測常見的使用錯誤。
C++ 標准庫的實現可以檢測和診斷常見的使用錯誤,從而提高可用性。
您可以使用 static_assert 聲明在編譯時檢查重要的程序不變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.