您是否建议在新的C API中使用errno?
是否应该使用其他报告http://developer.gnome.org/glib/stable/glib-Error-Reporting.html等问题的方法?
你推荐什么?
答案 0 :(得分:4)
errno
应保留给C标准库,程序应将其视为只读值。
编写新代码我强烈建议不要使用errno样式的全局变量来进行错误代码检查。假设您有函数a
,b
通过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
在具有多个线程的程序(或其他形式的并发中不包含全局变量的单独副本)中的效果如何。典型的结论可能“不太好”,因此其他解决方案可能更为可取。