C++为什么"assert"不是关键字?
In C++ why isn't "assert" a keyword?
现在"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++语言中添加静态断言有以下好处:
库可以在编译时检测常见的使用错误。
C++标准库的实现可以检测和诊断常见的使用错误,从而提高可用性。
您可以使用static_assert声明在编译时检查重要的程序不变量。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 如何在 assert() 和 static_assert() 之间调度,如果在 constexpr 上下文中依赖?
- C++为什么"assert"不是关键字?