【问题标题】:What happened to std::assertstd::assert 发生了什么
【发布时间】:2016-09-04 14:03:07
【问题描述】:

This answer 大量重复表明我应该使用 #include <c*> 作为我在 C++ 代码中提取的 C 头文件,并且我应该使用 std::* 调用它们。

我一直在这样做,但我注意到一个例外。 std::assert 似乎没有被定义,即使我正确地#include <cassert>

这里发生了什么?这是实施疏忽,还是实际例外?

【问题讨论】:

  • assertmacro
  • assert 很可能被实现为不能在命名空间中使用的宏(因为它不会像内联函数那样产生语言标识符)
  • @SergeyA 你从来没有测试过你的代码……曾经吗?
  • @SergeyA:我支持你。在生产中停止执行操作的功能。因此,生产和调试代码的行为完全不同。如果只是在测试而不是在生产中出现问题,那么你有一些特殊的代码。哦,等等,我们有一些针对异常情况的东西。
  • @SergeyA:对于那些发现你的断言 “所有带有无效变体的有趣事情通常发生在优化代码中” 是错误的人来说,这是有价值的。

标签: c++ c namespaces std assert


【解决方案1】:

assert 是一个宏,而不是一个函数。因此,它需要与普通的旧 assert(condition) 一起使用。

这是一个支持链接:http://en.cppreference.com/w/cpp/error/assert

【讨论】:

  • 只是觉得支持链接在这里可能会有所帮助:en.cppreference.com/w/cpp/error/assert
  • 供参考:C++17 标准在第 20.5.1.2 章第 5 节 ([headers]) 中列出了这一点:“在 C 中定义为宏的名称应在 C + 中定义为宏+ 标准库 [...]"
【解决方案2】:

assert 是一个宏,因此无法将其限制为命名空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 2019-05-07
    • 2020-01-11
    • 1970-01-01
    • 2022-11-16
    • 2017-09-09
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多