簡體   English   中英

在 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 斷言具有以下好處:

  1. 庫可以在編譯時檢測常見的使用錯誤。

  2. C++ 標准庫的實現可以檢測和診斷常見的使用錯誤,從而提高可用性。

  3. 您可以使用 static_assert 聲明在編譯時檢查重要的程序不變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM