在什么情况下我们需要包括<cassert>?
In what cases we need to include <cassert>?
在什么情况下我们应该包括卡塞特?
简而言之,不要使用它; 使用 <assert.h>
.
C++11 删除了对"c...."的任何正式保证。标头不会污染全局命名空间。
它从来都不是一个实践中的保证,现在它甚至不是一个正式的保证。
因此,对于 C++11,使用"c...."标头变体,虽然存在一个明显而明显的缺点,即与一个编译器和该编译器的版本配合良好的代码可能无法与另一个编译器或版本编译,例如由于名称冲突或全局命名空间中的不同重载选择。
因此,虽然cassert
在 C++03 中毫无意义(您不能将宏放在命名空间中(,但在 C++11 中,它完全没有意义——即使是作为一般方案的特例。
附录,2013年12月22日:
该标准根据
C++11 §D.5/2:
"每个 C 标头,每个标头都有一个形式
name.h
的名称,其行为就好像由相应的 cname 标头放置在标准库命名空间中的每个名称都放置在全局命名空间范围内。">
C++11 §D.5/3(非规范性示例(:
"标头
<cstdlib>
确保在命名空间std
中提供其声明和定义。它还可以在全局命名空间中提供这些名称。标头<stdlib.h>
确保在全局命名空间中提供与 C 标准相同的声明和定义。它还可以在命名空间std
中提供这些名称。
Stack Overflow用户C.R.的评论让我意识到,某些版本的g++,例如MinGW g++ 4.7.2,在<X.h>
标头方面非常不标准,缺少例如 C++标准要求sin
:
我已经知道 MinGW g++ 4.7.2 也完全缺少 swprintf
等函数,并且在纯C++库中也有同样的缺点,例如缺少 C++11 std::to_string
。但是,有关它缺少 C 函数重载的信息对我来说是新的。
在实践中,缺乏 g++ 的重载意味着
忽略 G++ 问题,或
避免使用缺少的 G++ 重载,
例如,仅使用double sin( double )
,或使用
std
命名空间重载
(然后需要包含<cmath>
以保证它们在 G++ 中的存在(。
为了使用 g++ std
命名空间重载非限定,一种实用的方法是为此编译器定义标头包装器。我已经使用这种方法来解决 g++ 的缺点。给printf
一家。正如大卫·惠勒(David Wheeler(曾经说过的那样,"计算机科学中的所有问题都可以通过另一个层次的间接来解决"......
然后可以安排事情,以便使用 g++ 缺失重载的标准代码也使用 g++ 进行编译。这会将编译器调整为标准,具有固定数量的代码。
就像任何其他头文件一样#include <cassert>
,当您使用该头文件中声明的内容(例如 assert()
.
查看易于访问的参考
#include <iostream>
// uncomment to disable assert()
// #define NDEBUG
#include <cassert>
int main()
{
assert(2+2==4);
std::cout << "Execution continues past the first assertn";
assert(2+2==5);
std::cout << "Execution continues past the second assertn";
}
assert.h 定义了一个可用作标准调试工具的宏函数。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中