std::assert发生了什么?

27

这篇回答以及它的许多副本表明,在C++代码中,我应该使用#include <c*>引入C头文件,并且我应该使用std::*来调用它们。

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

这是怎么回事?这是实现上的疏忽还是真正的例外情况?


8
assert 是一个宏(macro),具体细节可参考链接:http://en.cppreference.com/w/cpp/error/assert 。 - smac89
6
你从来没有测试过你的代码吗? - Barry
2
@SergeyA:我完全同意你的观点。在生产环境下停止执行某些功能,与调试代码时的行为完全不同。如果某些问题只会在测试中出现而不会在生产中出现,那么你的代码就存在一些异常情况。哦,等等,我们有一些针对异常情况的解决方案。 - Martin York
7
@SergeyA:对于那些认为你的断言“所有有问题的变体都发生在经过优化的代码中”的说法是错误的人来说,这是有价值的。 - Benjamin Lindley
1
@JonathanMee 宏是由C预处理器处理的(基本上是自动复制/粘贴工具,至少在宏方面是这样),因此在代码到达编译器之前就不存在了。除非宏直接扩展为函数或类,否则甚至不可能有任何东西出现在命名空间中;如果它确实扩展为其中一个,则它所扩展成的内容可以放在命名空间中,但在我们到达那里之前,它本身将被删除 - Justin Time - Reinstate Monica
显示剩余14条评论
2个回答

30

在这里,我认为提供一个支持链接可能会很有帮助:http://en.cppreference.com/w/cpp/error/assert - Jonathan Mee
3
参考文献:C++17标准第20.5.1.2章节第5段([headers]):在C语言中定义为宏的名称,在C++标准库中也必须定义为宏。 - doak

16

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接