4

你推荐在新的 C API 中使用 errno 吗?

是否应该使用其他报告问题的方法,例如http://developer.gnome.org/glib/stable/glib-Error-Reporting.html

你有什么建议吗?

4

2 回答 2

4

errno应保留给 C 标准库,程序应将其视为只读值。

编写新代码我强烈反对使用 errno 样式的全局变量来检查错误代码。假设您有功能ab通过然后报告它们的状态,ab_error您必须编写如下内容:

a();
if( ab_error == AB_NOERROR ) {
    b();
    if( ab_error == NO_ERROR ) {
        /* ... */
    }
}

你看,你相当快地堆积了嵌套级别。但是,如果您的函数返回错误代码,您可以这样编写:

int error_a;
int error_b;

if( (error_a = a()) == A_NOERROR
 && (error_b = b()) == B_NOERROR
){
    /* ... */
} else {
    /* test the error variables */
}

您甚至可以像这样链接多个错误条件:

int error_a;
int error_b;
int error_c;

if( (error_a = a()) == A_NOERROR
 &&  ( (error_b = b()) == B_NOERROR
    || (error_c = c()) == C_NOERROR )
){
    /* ... */
} else {
    /* test the error variables */
}

这比将整个内容分散在几个嵌套的 if 语句中更具可读性。

于 2011-04-23T11:31:21.140 回答
1

您总是可以问自己,全局errno在具有多个线程(或其他形式的不包含全局变量的单独副本)的程序中工作得如何。典型的结论可能是“不太好”,因此其他解决方案可能更可取。

于 2011-04-23T13:12:23.450 回答