C 如何指定在执行结束时执行一条指令?

C 如何指定在执行结束时执行一条指令?,c,order-of-execution,C,Order Of Execution,换句话说: 是否可以延迟某条指令,如printf,使其在执行的最后执行准确地执行?C语言为此提供atexit: -注册一个在正常进程终止时调用的函数C语言为此提供atexit: -注册要在正常进程终止时调用的函数 func所指向的函数将在没有参数的情况下自动调用 当程序正常终止时 例如: #include <stdio.h> /* puts */ #include <stdlib.h> /* atexit */ void fnExit1(void) {

换句话说:

是否可以延迟某条指令,如
printf
,使其在执行的最后执行准确地执行?

C语言为此提供atexit:


-注册一个在正常进程终止时调用的函数

C语言为此提供atexit:

-注册要在正常进程终止时调用的函数

func
所指向的函数将在没有参数的情况下自动调用 当程序正常终止时

例如:

#include <stdio.h>      /* puts */
#include <stdlib.h>     /* atexit */

void fnExit1(void) {
  puts("Exit function 1.");
}

void fnExit2(void) {
  puts("Exit function 2.");
}

int main(void) {
  atexit(fnExit1);
  atexit(fnExit2);
  puts("Main function.");
  return 0;
}
你想要

func
所指向的函数将在没有参数的情况下自动调用 当程序正常终止时

例如:

#include <stdio.h>      /* puts */
#include <stdlib.h>     /* atexit */

void fnExit1(void) {
  puts("Exit function 1.");
}

void fnExit2(void) {
  puts("Exit function 2.");
}

int main(void) {
  atexit(fnExit1);
  atexit(fnExit2);
  puts("Main function.");
  return 0;
}

我写了一个使用的例子:


我写了一个使用的例子:



你在找函数吗?我要用它来解决我的问题,谢谢:)这个在Windows上也能用吗?应该,它是ANSI Cfunction@h0ch5tr4355正如您在我的回答中所看到的,
atexit()
stdlib.h
的一部分,所以它是ANSI C。您在寻找函数吗?我将尝试用该函数解决我的问题,谢谢:)这也适用于Windows吗?应该可以,这是ANSI Cfunction@h0ch5tr4355正如您在我的回答中所看到的,
atexit()
stdlib.h
的一部分,因此它是ANSI C。POSIX文档中的描述没有示例,但可能比…plusplus…:)中的更可取是的@pmg,我正在整理你的答案,我准备投票,但你删除了!谢谢你的帮助。。。PS:在开始时,我也使用了一个Linux ref,它缺少一个示例,这就是为什么我切换到CPlucPlus,我知道它可能看起来很奇怪(我记得我在第一学期学习C时链接到它,就像这是什么一样)。)POSIX文档中的描述没有示例,但可能比…plusplus…:)中的描述更可取是的@pmg,我正在整理你的答案,我准备投票,但你删除了!谢谢你的帮助。。。PS:在开始时,我也使用了一个Linux ref,它缺少一个示例,这就是为什么我切换到CPlucPlus,我知道它可能看起来很奇怪(我记得我在第一学期学习C时链接到它,就像这是什么一样)。)完整的答案应该包括讨论什么时候不调用由
atexit
注册的函数,以及讨论
在\u quick\u exit
和注册中止信号的处理程序。@EricPostpuschil:自从。。。六羟甲基三聚氰胺六甲醚。。。自从我停止使用usenet。POSIX站点没有提到快速退出时的
:直到2分钟前我才知道它的存在。我正在用其他信息编辑我的答案,谢谢。如果读者想要更多关于快速退出时的
的信息,它就在里面。@pmg:令人痛心的是,我们也在里面找到了,它打算使用
退出时不调用
atexit
(事实上,也不是快速退出时的
)。然而我们到目前为止还没有这样的修饰…@pmg:是的,信息是在C标准中。这并不能改变这样一个事实:没有它,这个答案是不完整的。应告知试图创建退出处理人的人员各种处理人可能被执行或可能不被执行的情况以及可以采取的措施,因为这些信息是实现目标所必需的。完整的答案应该包括讨论什么时候不调用由
atexit
注册的函数,以及讨论
在\u quick\u exit
和注册中止信号的处理程序。@EricPostpischil:自从。。。六羟甲基三聚氰胺六甲醚。。。自从我停止使用usenet。POSIX站点没有提到快速退出时的
:直到2分钟前我才知道它的存在。我正在用其他信息编辑我的答案,谢谢。如果读者想要更多关于快速退出时的
的信息,它就在里面。@pmg:令人痛心的是,我们也在里面找到了,它打算使用
退出时不调用
atexit
(事实上,也不是快速退出时的
)。然而我们到目前为止还没有这样的修饰…@pmg:是的,信息是在C标准中。这并不能改变这样一个事实:没有它,这个答案是不完整的。寻求创建退出处理者的人员应被告知各种处理者可能被执行或可能不被执行的情况以及可以对此采取的措施,因为这些信息对于实现目标是必要的。
#include <stdio.h>
#include <stdlib.h>

void foo(void) {
    printf("\nDone!\n");
}

int main(void) {
    atexit(foo);
    for (;;) {
        int tmp = rand() % 100; // unseeded
        printf("%02d ", tmp);
        if (!tmp) break;
    }
    return 0;
}
18 42 02 00 Done!