在什么情况下我们需要包括<cassert>?

In what cases we need to include <cassert>?

本文关键字:lt gt cassert 包括 情况下 我们 在什么      更新时间:2023-10-16

在什么情况下我们应该包括卡塞特

简而言之,不要使用它; 使用 <assert.h> .

C++11 删除了对"c...."的任何正式保证。标头不会污染全局命名空间。

从来都不是一个实践中的保证,现在它甚至不是一个正式的保证。

因此,对于 C++11,使用"c...."标头变体,虽然存在一个明显而明显的缺点,即与一个编译器和该编译器的版本配合良好的代码可能无法与另一个编译器或版本编译,例如由于名称冲突或全局命名空间中的不同重载选择。

因此,虽然cassert在 C++03 中毫无意义(您不能将宏放在命名空间中(,但在 C++11 中,它完全没有意义——即使是作为一般方案的特例。


附录,2013年12月22日:

该标准根据 标头定义每个 C++ C 标头 标头,而 cX 标头又根据相应的 C 库标头定义。

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 定义了一个可用作标准调试工具的宏函数。