您是否建议在新的C API中使用errno?

时间:2011-04-23 11:20:39

标签: c api errno

您是否建议在新的C API中使用errno?

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

你推荐什么?

2 个答案:

答案 0 :(得分: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语句上之外,它的可读性要高得多。

答案 1 :(得分:1)

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