在程序退出main()函数之后,还有可能执行一部分代码吗?
可以,但这要借助C库函数atexit()。利用atexit()函数可以在程序终止前完成一些“清理”工作——如果将指向一组函数的指针传递给atexit()函数,那么在程序退出main()函数后(此时程序还未终止)就能自动调用这组函数。下例的程序中就使用了atexit()函数:
# include <stdio.h>
# include <atdlib. h>
void close_files(void);
void print_regiatration_message(void);
int main(int, char ** );
int main (int argc, char** argv)
{
atcxitCprint_regiatration_message);
atexit(cloae_files) ;
while (rec_count <max_recorda)
{
process_one_record ( );
}
exit (0);
}
在上例中,通过atexit()函数指示程序在退出main()函数后自动调用函数close_files()和print_registration_message(),分别完成关闭文件和打印登记消息这两项工作。
在使用atexit()函数时你要注意这样两点:第一,由atexit()函数指定的要在程序终止前执行的函数要用关键字void说明,并且不能带参数;第二,由atexit()函数指定的函数在入栈时的顺序和调用atexit()函数的顺序相同,即它们在执行时遵循后进先出(LIFO)的原则。例如,在上例中,由atexit()函数指定的函数在入栈时的顺序如下所示:
atexit(print_registration_message);
atexit(close_files);
根据LIFO原则,程序在退出main()函数后将先调用close_files()函数,然后调用print_registration_message()函数。
利用atexit()函数,你可以很方便地在退出main()函数后调用一些特定的函数,以完成一些善后工作(例如关闭程序中用到的数据文件)。
# include <stdio.h>
# include <atdlib. h>
void close_files(void);
void print_regiatration_message(void);
int main(int, char ** );
int main (int argc, char** argv)
{
atcxitCprint_regiatration_message);
atexit(cloae_files) ;
while (rec_count <max_recorda)
{
process_one_record ( );
}
exit (0);
}
在上例中,通过atexit()函数指示程序在退出main()函数后自动调用函数close_files()和print_registration_message(),分别完成关闭文件和打印登记消息这两项工作。
在使用atexit()函数时你要注意这样两点:第一,由atexit()函数指定的要在程序终止前执行的函数要用关键字void说明,并且不能带参数;第二,由atexit()函数指定的函数在入栈时的顺序和调用atexit()函数的顺序相同,即它们在执行时遵循后进先出(LIFO)的原则。例如,在上例中,由atexit()函数指定的函数在入栈时的顺序如下所示:
atexit(print_registration_message);
atexit(close_files);
根据LIFO原则,程序在退出main()函数后将先调用close_files()函数,然后调用print_registration_message()函数。
利用atexit()函数,你可以很方便地在退出main()函数后调用一些特定的函数,以完成一些善后工作(例如关闭程序中用到的数据文件)。