在C ++中为什么不“断言”关键字?

时间:2011-06-02 17:59:07

标签: c++ assert keyword

现在“static_assert”是C ++ 0x中的关键字我认为用“assert”关键字替换C“assert”宏也是合乎逻辑的。

7 个答案:

答案 0 :(得分:3)

static_assert在编译时被解释,所以它必须是一个关键字,所以编译器可以处理它。

断言不需要是一个关键字,并且将它设置为一个没有多大意义,因为程序可能有许多方式来响应断言成功或失败。因此,在库中实现它更有意义,它通常实现为宏。

答案 1 :(得分:2)

除了在预处理期间,

assert没有编译时间意义。预处理器不了解C ++语言,因此关键字没有任何意义。

相比之下,static_assert在编译时进行评估。在这方面,使其成为关键词更有意义。编译器关心它的存在。

还有历史原因;它不是C中的关键字,并且在C ++中使用它会使现有的断言宏导致未定义的行为。

答案 2 :(得分:2)

基本上,因为它不需要它。运行时断言的现有断言机制非常好,不需要语言支持。

答案 3 :(得分:2)

其他答案为您的问题提供了一些可能的答案,但最近的提案表明断言可能确实成为C ++ 17中的关键字:https://isocpp.org/files/papers/N4154.pdf

答案 4 :(得分:1)

assert可以在库中实现,static_assert不能。因此static_assert获取关键字是因为它需要语言支持,而assert则不需要。

答案 5 :(得分:1)

为了与已经用c语言编写的代码兼容而无法完成此操作,该代码具有断言作为变量名称。因此,正如oli所提到的,我们将无法编译,因为断言不再是宏

答案 6 :(得分:1)

在C ++ 0x中(来自here):

  

在C ++ 0x中,可以声明静态断言以在编译时检测和诊断常见的使用错误。

这是static_assert语法:

>>-static_assert--(--constant-expression--,--string-literal----->

其中constant-expression必须在上下文中转换为bool。如果它转换为false,则编译器将根据string-literal发出错误。

所以,这基本上是需要关键字的语言的扩展。它不是运行时机制。

再次来自上面链接的文件:

  

向C ++语言添加静态断言具有以下好处:

     
      
  1. 库可以在编译时检测常见的使用错误。

  2.   
  3. C ++标准库的实现可以检测和诊断常见的使用错误,从而提高可用性。

  4.   
  5. 您可以使用static_assert声明在编译时检查重要的程序不变量。

  6.   
相关问题