在什么情况下,我们需要包括 ?(In what cases we need to includ

2019-06-24 12:53发布

在什么情况下,我们应该包括了cassert?

Answer 1:

总之,不要使用它; 使用<assert.h>

C ++ 11移除的任何正式保证“C ......”头,不污染全局命名空间。

这是从来没有一个在实践保障,而现在它甚至不是一个正式的保证。

因此,利用C ++ 11不再有任何可设想的优点在使用“C ....”报头的变体,同时存在的不同的和明显的缺点的代码与一个编译器和版本,编译器的效果很好,可以不能与其他编译器或版本的编译,例如由于名称冲突或在全局命名空间的不同过载的选择。

所以,当cassert在C ++ 03是相当无意义的(你不能把在命名空间中宏),这是完全没有意义的-即使作为一般方案的一种特殊情况-在C ++ 11。


增编 ,2013年12月22日:

该标准定义了在<CX>头,其又在相应的C库头来定义的方面每个C ++ C头 <的Xh>头。

C ++ 11§D.5/ 2:

“每一个的C头,每一个都具有以下形式的名称name.h ,行为如同由相应的CNAME头放置在标准库的名称空间的每个名称放置在全局命名空间范围之内。”

C ++ 11§D.5/ 3(非规范为例):

“报头<cstdlib>可靠地提供了命名空间内的声明和定义std 。 它也可以在全局命名空间内提供这些名称。 头<stdlib.h>可靠地提供相同的声明和定义全局命名空间内,就像在C标准。 它也可以在命名空间内提供这些名称std “。

堆栈溢出用户CR的评论让我知道,一些版本的克++,如MinGW的克++ 4.7.2,都相当不规范相对于所述<Xh>标头,缺乏例如重载sin ,在C ++标准要求:

我已经知道的MinGW克++ 4.7.2也完全缺乏功能,如swprintf ,并且它具有在纯C ++库同上缺点,例如缺乏C ++ 11 std::to_string 。 然而,它缺乏的C函数重载的信息是新的我。

在实践中,缺乏与重载G ++装置

  • 忽略克++问题,或

  • 使用缺少克++避免过载,
    使用例如仅double sin( double ) ,或

  • 使用std命名空间重载
    (一个接着需要包括<cmath>以保证其与克存在++)。

为了使用的克++ std命名空间重载不合格的,一个实用的方法是,以限定包装标头为这个编译器。 我用这种方法来解决G ++缺点WRT。 到printf家庭。 对于大卫·惠勒曾经说过,“计算机科学的所有问题都可以通过间接的另一个层面解决了” ...

然后东西都可以布置成使得使用标准代码克++的丢失过载,也与克编译++。 这调节编译器的标准,以更少的码量固定。



Answer 2:

就像任何其他的头文件,你#include <cassert>当您使用在头文件中声明的东西,如assert()



Answer 3:

见一个方便的参考

#include <iostream>
// uncomment to disable assert()
// #define NDEBUG
#include <cassert>

int main()
{
    assert(2+2==4);
    std::cout << "Execution continues past the first assert\n";
    assert(2+2==5);
    std::cout << "Execution continues past the second assert\n";
}


Answer 4:

ASSERT.H定义了可以用作标准调试工具一个宏功能。



文章来源: In what cases we need to include ?