繁体   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