- 头文件<stddef>、<cstdlib>、<cstring>与其C对应版本兼容,在C++程序中经常用到。它们是C头文件<stddef.h>、<stdlib.h>、<string.h>的较新版本,定义了一些常用的常量、宏、类型和函数
一、<cstddef>
NULL与nullptr
- 在C++11之前,NULL通常用来表示一个不指向任何对象的pointer。自C++11其以nullptr表示这个语义
- C++保证NULL其实就是0(其类型可以是int也可以是long)
- C语言中的NULL通常定义为(void*)0,这在C++中并不正确,NULL必须是个整数类型,否则你将无法将NULL赋予一个pointer。这是因为C++并没有定义从void*到任何类型的自动类型转换操作
- 从C++11开始使用nullptr取代NULL
- NULL与nullptr也在另一篇文章中有介绍:https://blog.csdn.net/qq_41453285/article/details/104946204
二、<cstdlib>
EXIT_SUCCESS、EXIT_FAILURE
- 这两被用来传递给exit()的实参,也可以当做main的返回值
exit()、abort()
- exit():会销毁所有static对象、清空所有缓冲区,关闭所有IO通道,然后终止程序,终止前会先调用由atexit()注册的函数。如果atexit()注册的函数抛出异常,就会调用terminate()
- abort():会立刻终止函数,不作任何清理工作
- 这两个函数都不会销毁局部对象,因为堆叠辗转(stack unwinding)开展不会被执行起来。如果你希望确保所有局部对象的析构函数被调用,应该运用异常或正常返回机制,然后从main()退出程序
- atexit()注册的函数,在程序正常退出时会依注册相反次序被一一调用。无论是通过exit()退出或从main()尾部退出
quick_exit()
- 从C++11期,该函数不再摧毁对象,而是调用先前曾被at_quick_exit()注册过的函数(以注册次序之逆向),然后调用_Exit()结束程序,不带任何析构或清理动作
- 这意味着quick_exit()和_Exit()都不会清空(flush)标准文件缓冲区(标准输出区和错误输出区)
- C++程序的终止(abort)——一种意外结束而非“意料内的结束加上发出一个错误代码”——通常做法是调用std::terminate(),后者默认调用abort()。举个例子,如果某析构函数或某个被声明为noexcept的函数抛出异常,就会发生这种事
三、<cstring>
- 下图展示了<cstring>头文件中最重要的表达式:用以设定、拷贝、搬移内存的底层函数
- 这些函数被应用于character trait(详情见《C++标准库》P855)
转载:https://blog.csdn.net/qq_41453285/article/details/105464646
查看评论