首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >良好的实践-许多在功能终止时要做的事情- goto替代

良好的实践-许多在功能终止时要做的事情- goto替代
EN

Stack Overflow用户
提问于 2012-10-10 16:29:17
回答 1查看 889关注 0票数 1

可能重复: 在C中有效地使用goto进行错误管理?

最近,我遇到了这样的C代码:

代码语言:javascript
复制
if( !condition1){
    goto failure;
}

some_stuff_that_needs_manual_undoing();

if( !condition2){
    goto failure;
}

// And many more lines such as the ones above
return 0;

failure:
// Do a lot of stuff here, free, file closing and so on
return -1;

总结一下情况:

我有一个长函数,可以在一行中完成几件事情(比如打开一个文件,然后根据文件内容分配内存,然后连接do数据库等等)。当然,我希望正确地释放资源,但是有很多地方会导致函数过早结束(而且所有这些地方都需要清理)。

问题:如何正确地做这件事?

虽然goto似乎没有那么糟糕的做法,它也是似乎不是很好的解决办法

我认为以下几点:

使用一个宏来完成这项工作,例如:

代码语言:javascript
复制
#define CLEANUP if( memory != NULL)free(memory); \
                if( fp != NULL) fclose(fp);\
                // ...

if( !condition1){
    CLEANUP
    return -1;
}

if( !condition2){
    CLEANUP
    return -2;
}

// ...

这将导致重复的程序集,但清理代码将位于一个位置。

将函数封装到另一个函数中

代码语言:javascript
复制
int _some_stuff_do_work(void **memory, FILE **file, ...){
    // Would just return on error
}

int some_stuff() {
    void *memory = NULL;
    FILE *file = NULL;

    _some_stuff_do_work( &memory, &file, ...);
    if( fp) fclose(fp);
}

如果需要清理的东西超过3-5件,这可能会变得很糟糕(这个函数会有很多争论,而且总是会有问题)。

OOP -析构函数

代码语言:javascript
复制
typedef struct {
    void *memory;
    FILE *fp;
} LOCAL_DATA;

// Destructor
void local_data_destroy( LOCAL_DATA *data)
{
    if( data->fp){
        free(data->fp);
        data->fp = NULL;
    }
}

但是,这可能会导致许多功能(和结构)只在整个应用程序中使用一次,而且看起来它可能会产生巨大的质量。

循环和中断语句

代码语言:javascript
复制
while(1){
    if( !condition1){
       break;
    }

    // ...

    break;
}

if( fp) fclose(fp);

我在may上找到了这个,但是使用了一个迭代循环?我不知道,这似乎完全不合常理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-10 16:48:04

后藤是该走的路。首先要理解为什么"goto是坏的“,然后你会发现,在你描述goto的情况下,goto并不是很糟糕。不惜一切代价避免goto是错误的,它来自于对好的编程原则的浅薄理解。

这是要走的路(Linux内核源代码):http://goo.gl/uSgp5

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12824130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档