C/C++语言函数学习(1):atexit、exit、return

/*stdlib.h*void exit(int status);*功  能:终止程序*int atexit(void (*func)(void));*功  能: 注册终止函数,在main函数结束以后调用*/
//==============================================#include <stdio.h>
#include <stdlib.h>
void exit_fn1(void)
{printf("Exit function #1 called\n");exit(1);printf("shiyan");
}
void exit_fn2(void)
{printf("Exit function #2 called\n");atexit(exit_fn1);
}
int main(void)
{/* post exit function #1 */atexit(exit_fn1);/* post exit function #2 */atexit(exit_fn2);printf( "Hello World!\n" );return 0;
}//结果:
Hello World!
Exit function #2 called
Exit function #1 called
Exit function #1 called



     exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。 main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新 所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。
=======================================================================
exit与return
1、return返回函数值,是关键字;exit是一个函数
2、return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。
3、 return是函数的退出(返回);exit是进程的退出。
4、return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。
5、return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一 个状态返回给OS,这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关,一般是 0 为正常退出,非0 为非正常退出。
6、非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。


     atexit()函数 函数声明:int atexit(void (*func)(void)); 很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。 atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void)); 在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。
     atexit这个玩意超有用,可以按照你予设的顺序摧毁全局变量(类),例如有个log类,你在其它的全局类里也有可能调用到Log类写日志。所以log 类必须最后被析构 。假如没有规定析构顺序,那么程序在退出时将有可能首先析构log类,那么其它的全局类在此时将无法正确写日志。 把数据写回文件, 删除临时文件, 这才是真正有用的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++语言函数学习(2)qsort

/***函数名称: qsort*函数原型: void qsort(void *base,size_t num,size_t width,int (*fcmp)(const void *,const void *)*函数功能: 使用快速排序法对数组base进行排序*函数返回:*参数说明:*base 待排序数组*num 数组元素个数*width 每个…

C/C++语言函数学习(3)STL中map容器

/******************************************************************map的基本操作函数&#xff1a;C Maps是一种关联式容器&#xff0c;包含“关键字/值”对begin() 返回指向map头部的迭代器clear(&#xff09; 删除所有元素count() 返回指定元素…

C/C++语言函数学习(4)字符串处理函数

#include <string.h>函数名称: strchr函数原型: char* strchr(char* str,char ch);函数功能: 找出str指向的字符串中第一次出现字符ch的位置函数返回: 返回指向该位置的指针,如找不到,则返回空指针参数说明: str-待搜索的字符串&#xff0c;ch-查找的…

C/C++函数学习(6)容器分类

http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分钟掌握STL STL容器分三大类&#xff1a;顺序容器(sequence container)、关联容器(associative container)和容器适配器(container adapter)。另外我们熟悉的C语言式数组合string&#xff0c;它们也是一种容器&#xff0c;称为…

Python字符串内建函数

方法 描述 string.capitalize() 把字符串的第一个字符大写 string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 string.count(str, beg0,endlen(string)) 返回 str 在 string 里面出现的次数&#xff0c;如果 beg 或者 end 指…

巧用快捷键轻松设置Excel单元格格式

巧用快捷键轻松设置Excel单元格格式 在应用程序中使用快捷键&#xff0c;可以使我们避免在键盘与鼠标之间来回切换&#xff0c;从而节省大量的时间&#xff0c;显著地提高工作效率。多掌握一些常用的快捷键&#xff0c;可以使您告别菜鸟时代&#xff0c;迅速成长为电脑应用的高…

perror()与strerror()的应用及区别 man手册查询

perror() 和 strerror() 以一种直观的方式打印出错误信息&#xff0c;对于调试程序和编写优秀的程序非常有用。下面是perror() 与 strerror() 的使用范例及区别&#xff1a;perror()原型&#xff1a;#include <stdio.h>void perror(const char *s);其中&#xff0c;perro…

Linux下解压缩包命令

各种压缩文件的解包与打包命令 .tar 解包&#xff1a;tar xvf FileName.tar打包&#xff1a;tar cvf FileName.tar DirName——————————————— .tar .xz 解包&#xff1a;xz -d openvpn-2.3.5.tar.xz --stdout | tar -xv 打包&#xff1a;tar cvf - openvpn-2.3.…

PyQt学习总结

1&#xff09;QDoubleSpinBox() setRange(min,max) 设置范围Min~maxsetSingleStep(step) 设置步长为stepsetValue(value) 设置当前值为valuesetPrefix("$") 设置前缀为$setSuffix("%"&#xff09; 设置后缀为%selectAl…

Qt样例学习1(数字时钟)

/*main.cpp*/ #include <QApplication> #include <QTextCodec> #include "digitalclock.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);//显示本地化&#xff0c;解决中文乱码.QTextCodec::setCodecForTr(QTextCodec::codecForLoca…

linux网络编程--数据结构与函数原型

套接字有三种类型&#xff1a;流式套接字&#xff08;SOCK_STREAM&#xff09;&#xff0c;数据报套接字&#xff08;SOCK_DGRAM&#xff09;及原始套接字。 socket() | bind() | listen() | socket() a…

OpenGL画简单图形

#include <GL/glut.h>#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") /*三角形GL_TRIANGLES(三个点成一个三角形)GL_TRIANGLE_STRIP(相邻三点成一个三角形)GL_TRIANGLE_FAN(同第二个&#xff0c;后2个和第一…

ubuntu下编译OpenGL

安装基本编译环境&#xff1a; sudo apt-get install build-essential 安装Opengl工具箱&#xff1a; sudo apt-get install freeglut3-dev /* main.cpp */ #include <GL/glut.h> #include <stdlib.h> #include <stdio.h> #include "app.h" using …

关于linux的进程和线程

关于linux的进程和线程 http://kenby.iteye.com/blog/1014039 Linux下的多线程编程 http://fanqiang.chinaunix.net/a4/b8/20010811/0905001105.html 线程的最大特点是资源的共享性&#xff0c;但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程…

linux setsockopt函数

功能描述&#xff1a; 获取或者设置与某个套接字关联的选 项。选项可能存在于多层协议中&#xff0c;它们总会出现在最上面的套接字层。当操作套接字选项时&#xff0c;选项位于的层和选项的名称必须给出。为了操作套接字层的选项&#xff0c;应该 将层的值指定为SOL_S…

struct linger

Linux下tcp连接断开的时候调用close()函数&#xff0c;有优雅断开和强制断开两种方式。那么如何设置断开连接的方式呢&#xff1f;是通过设置socket描述符一个linger结构体属性。linger结构体数据结构如下&#xff1a; #include <arpa/inet.h>struct linger {int l_onoff…

几种常见的排序算法

冒泡排序 冒泡排序算法的运作如下: 1、比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 2、对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。这步做完后&#xff0c;最后的元素会是最大的数。 3、针对所有的元素重复以上的步骤…

linux下调试工具的应用

http://www.ibm.com/developerworks/cn/linux/l-pow-debug/

数据结构--赫夫曼树及其应用

讲解请参考 赫夫曼 ------ 赫夫曼树和赫夫曼编码的存储表示------ typedef struct {unsigned int weight;unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char ** HuffmanCode;void HuffmanCoding(HuffmanTree& HT,HuffmanCode & HC,int *w,int …

sqlite C/C++ API

官网&#xff1a;https://sqlite.org/download.html 下载代码安装三步走&#xff1a; ./configure // ./configure --help查看安装参数设置&#xff0c;学习configure的配置&#xff0c;明白安装后include、lib、bin等文件的位置 make make install学习SQL基本语法&#xff0…