C++:程序终止

本文介绍了C++中几种终止程序的方式,包括调用exit函数、abort函数和使用return语句从main中退出。exit函数允许设置返回代码,而abort函数会立即终止程序,跳过析构过程。此外,还讨论了atexit函数在程序终止前执行操作的用法以及静态对象的析构顺序。

简介

在 c + + 中,可以通过以下方式退出程序:
调用 exit 函数。
调用 abort 函数。
从执行 return 语句 main 。

exit 函数

exit在中声明的函数 <stdlib.h> 终止 c + + 程序。 作为的参数提供的值 exit 将作为程序的返回代码或退出代码返回到操作系统。 按照约定,返回代码为零表示该程序已成功完成。 您可以使用常量 EXIT_FAILURE 以及 EXIT_SUCCESS 在中定义的 <stdlib.h> 来指示程序是成功还是失败。

return 从函数发出语句 main 等效于 exit 使用返回值作为参数来调用函数。

abort 函数

abort还在标准包含文件中声明的函数 <stdlib.h> 终止 c + + 程序。 与之间的区别在于 exit abort exit 允许 c + + 运行时终止处理 (全局对象析构函数) 调用,但会 abort 立即终止程序。 abort函数会绕过已初始化全局静态对象的正常析构进程。 它还会绕过函数指定的任何特殊处理 atexit 。

atexit 函数

使用 atexit 函数指定在程序终止之前执行的操作。 在 atexit 执行退出处理函数之前,不会在对的调用之前初始化全局静态对象。

return 语句 main

发出的 return 语句 main 在功能上等效于调用 exit 函数。 请考虑以下示例:

// return_statement.cpp
#include <stdlib.h>
int main()
{
    exit( 3 );
    return 3;
}

exit前面的 return 示例中的和语句在功能上相同。 通常情况下,c + + 要求具有以外返回类型的函数 void 返回值。 此 main 函数是一个异常,它可以不带 return 语句结束。 在这种情况下,它会将实现特定值返回到调用进程。 return 语句允许您指定返回值 main 。

静态对象的析构

当从调用 exit 或执行 return 语句时 main ,静态对象会按其初始化 (的相反顺序销毁,前提是在 atexit) 存在时调用。 以下示例演示如何进行此类初始化和清理工作。

示例

在下面的示例中,将在 sd1 sd2 进入之前创建并初始化静态对象和 main 。 此程序使用语句终止后 return ,首先 sd2 销毁,然后再销毁 sd1 。 ShowData 类的析构函数将关闭与这些静态对象关联的文件。

// using_exit_or_return1.cpp
#include <stdio.h>
class ShowData {
public:
   // Constructor opens a file.
   ShowData( const char *szDev ) {
   errno_t err;
      err = fopen_s(&OutputDev, szDev, "w" );
   }

   // Destructor closes the file.
   ~ShowData() { fclose( OutputDev ); }

   // Disp function shows a string on the output device.
   void Disp( char *szData ) {
      fputs( szData, OutputDev );
   }
private:
   FILE *OutputDev;
};

//  Define a static object of type ShowData. The output device
//   selected is "CON" -- the standard output device.
ShowData sd1 = "CON";

//  Define another static object of type ShowData. The output
//   is directed to a file called "HELLO.DAT"
ShowData sd2 = "hello.dat";

int main() {
   sd1.Disp( "hello to default device\n" );
   sd2.Disp( "hello to file hello.dat\n" );
}

另一种编写此代码的方式为,使用块范围声明 ShowData 对象,并允许在它们超出范围时将其销毁:

int main() {
   ShowData sd1( "CON" ), sd2( "hello.dat" );

   sd1.Disp( "hello to default device\n" );
   sd2.Disp( "hello to file hello.dat\n" );
}

该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处
本文章博客地址:https://blog.youkuaiyun.com/it_cplusplus/article/details/118107716

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值