C++为什么"assert"不是关键字?

In C++ why isn't "assert" a keyword?

本文关键字:关键字 assert 为什么 C++      更新时间:2023-10-16

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

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

assert不需要是一个关键字,使其成为一个关键字也没有多大意义,因为程序可能希望通过多种方式来响应断言的成功或失败。因此,在库中实现它更有意义,而且它通常是作为宏实现的。

assert没有编译时意义,除非在预处理期间。预处理器没有C++语言的知识,所以关键字是没有意义的。

相比之下,static_assert是在编译时评估的。在这方面,将其作为关键字更有意义。编译器关心它的存在。

也有历史原因;它在C中不是一个关键字,在C++中使它成为一个关键字会使现有的断言宏产生未定义的行为。

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

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

assert可以在库中实现,static_assert不能。所以static_assert得到了一个关键字,因为它需要语言支持,而assert没有。

为了与已经用c编写的代码兼容,不能这样做,因为c已经将assert作为变量名。因此,正如oli所提到的,我们将无法编译,因为assert不再是宏

在C++0x中(从这里开始):

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

这是static_assert语法:

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

其中CCD_ 8必须在上下文上转换为CCD_。如果它转换为false,那么编译器将根据string-literal发出错误。

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

再次从上面链接的文件:

在C++语言中添加静态断言有以下好处:

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

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

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