在C程序中,是否可以在终止时调用代码? C++中,如果我希望有代码调用一些不好的事情,我可以把代码放在析构函数中,或者尝试catch。

在C程序中,是否可以在终止时调用代码? C++中,如果我希望有代码调用一些不好的事情,我可以把代码放在析构函数中,或者尝试catch。,c,C,C中是否有类似的技术,如果程序意外终止,我可以调用特定的例程(清理资源)?在C中,您使用C标准库函数atexit,它允许您指定一个void函数,在程序终止时不调用任何参数(从概念上讲,当到达第一次调用main的右括号}时) 您最多可以在portable C中注册32个这样的函数,它们的调用顺序与注册顺序相反 请参见如果要对某些特定行为调用特定例程,可以尝试处理信号: 例如,有人想处理分段错误: 处理CTRL+c的一个简单示例: #include <signal.h> #includ

C中是否有类似的技术,如果程序意外终止,我可以调用特定的例程(清理资源)?

在C中,您使用C标准库函数
atexit
,它允许您指定一个
void
函数,在程序终止时不调用任何参数(从概念上讲,当到达第一次调用
main
的右括号
}
时)

您最多可以在portable C中注册32个这样的函数,它们的调用顺序与注册顺序相反


请参见

如果要对某些特定行为调用特定例程,可以尝试处理信号:

例如,有人想处理分段错误:

处理CTRL+c的一个简单示例:

#include <signal.h>
#include <stdio.h>

void handle_signal(int);

int main(int argc, char* argv[])
{
    //Setup Signal handling
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = handle_signal;
    sigaction(SIGINT, &sa, NULL);
    ...
}

void handle_signal(int signal)
{
    switch (signal) {
        case SIGINT:
            your_cleanup_function();
            break;
        default:
            fprintf(stderr, "Caught wrong signal: %d\n", signal);
            return;
    }
}
#包括
#包括
无效句柄_信号(int);
int main(int argc,char*argv[])
{
//设置信号处理
struct-sigaction-sa;
memset(&sa,0,sizeof(sa));
sa.sa_handler=处理_信号;
sigation(SIGINT,&sa,NULL);
...
}
无效手柄信号(int信号)
{
开关(信号){
案例信号:
您的_cleanup_函数();
打破
违约:
fprintf(stderr,“捕获错误信号:%d\n”,信号);
返回;
}
}

正如后面的注释中所述,有许多不同的功能可供使用。

不,C中没有类似析构函数或try catch块的功能。您只需检查函数返回值并清理资源即可

通常C程序员使用臭名昭著的
goto
语句跳转到清理代码

void foo()
{
    if (!doA())
        goto exit;
    if (!doB())
        goto cleanupA;
    if (!doC())
        goto cleanupB;

    /* everything has succeeded */
    return;

cleanupB:
    undoB();
cleanupA:
    undoA();
exit:
    return;
}

复制自

的示例我不认为它回答了这个问题,您还应该提到并且最重要的是,这个答案和关于
atexit
的答案是互补的:
atexit
为正常终止触发,信号处理程序为(大多数)触发异常终止。用它来说,它只是一个边界链接的答案。最好是把相关的信息直接包含在回答中。BTW,它也适用于C++,在这个问题中被提到作为一个解决的问题<代码> fPrftf()。不是异步信号安全的,不能从信号处理程序中安全地调用。另请参见,
atexit
函数在您显式调用
exit
时被触发。您到底在说什么?这似乎与我的回答相矛盾。Goto语句没有那么臭名昭著!请检查AllThrough OP简介通过提到析构函数和try-catch来简化这个问题,实际的问题是“C中是否有类似的技术,如果程序意外终止,我可以调用一个特定的例程(清理资源)?”这个答案并不能回答问题。@EricPostphil当OP写下模棱两可或自相矛盾的问题时,就像这里一样,很难回答它们!我喜欢有三个几乎完全不同的答案,基于OP可能想要的三种不同解释。为什么要批评这个答案“不回答这个问题"?你也可以很容易地批评芭丝谢芭的回答与尝试/捕捉块无关。@SteveSummit:OP的帖子没有任何含糊不清或自相矛盾之处。帖子只包含一个疑问句,这句话很清楚,它说明了OP在程序终止时清理的目标,并且它是s与标题一致。另一句话只是介绍了问题,不是问题。而且,即使你认为OP想知道C是否有任何类型的本地try-catch块,很明显他们确实想知道一种在出口清理的方法,而这个答案并没有回答这个问题。