C 我应该设置错误吗?
我正在编写一个模块,它导出一个类似于C 我应该设置错误吗?,c,errno,C,Errno,我正在编写一个模块,它导出一个类似于send和recv的接口 由于这些函数应该分别返回发送和接收的字节数,因此我无法像通常那样进行正确的错误管理(即使用枚举数并返回助记符值) 在这种情况下,我应该像标准库那样设置errno?如果是这样的话,因为errno是线程特定的,有没有一种特殊的写入方式,或者我可以简单地给它赋值 编辑:试验时,我注意到按作业设置errno是有效的。不过:这对任何系统来说都是安全和可移植的吗?实际上,您可能可以进行“适当”(正如您所说)的错误管理,因为您返回了int 只需对读
send
和recv
的接口
由于这些函数应该分别返回发送和接收的字节数,因此我无法像通常那样进行正确的错误管理(即使用枚举数并返回助记符值)
在这种情况下,我应该像标准库那样设置errno
?如果是这样的话,因为errno
是线程特定的,有没有一种特殊的写入方式,或者我可以简单地给它赋值
编辑:试验时,我注意到按作业设置errno
是有效的。不过:这对任何系统来说都是安全和可移植的吗?实际上,您可能可以进行“适当”(正如您所说)的错误管理,因为您返回了int
只需对读取或写入的字节数使用非负值,对错误代码使用负值即可。您不必将自己限制在-1
:
enum myerrors {
ERR_NO_MEMORY = -1,
ERR_BAD_ARGS = -2,
ERR_CPU_EXPLODED = -3,
// and so on
};
但是,以您想要的方式设置errno
是有效的。该标准规定,errno
扩展为可修改的左值,这意味着您可以设置它。从C1x/n1425,7.5错误
:
。。。和errno
,它扩展为具有int类型的可修改左值,其值由多个库函数设置为正错误数
这有点旧,但表示您可以直接分配给它,即使它是一个宏,并且它将是线程本地的:
errno
的唯一可移植值是EDOM
和ERANGE
因此,这就回答了您的可移植性问题。您可以只为
errno
指定一个值,但请记住,根据您的情况,还有其他方式来表示错误,可能更合适:
int*
(或size.\u t*
或您使用的任何类型)的输出参数。然后可以返回错误代码是的,您可以分配给它,是的,分配将是线程安全的。请参见不仅可以设置
错误号
,而且在许多情况下应该设置错误号
。调用某些库函数时,只有先将errno
设置为零,才能可靠地检测到错误
从POSIX规范的strtol
:
[CX][Option Start]如果成功,strtol()函数将不会更改errno的设置
由于0、{LONG_MIN}或{LLONG_MIN}和{LONG_MAX}或{LLONG_MAX}在出错时返回,并且在成功时也是有效的返回,因此希望检查错误情况的应用程序应将errno设置为0,然后调用strtol()或strtoll(),然后检查errno。[选项结束]
我对分配它的技术细节更感兴趣,但我没想到会出现这种可移植性问题!:)@Dacav-我不认为有任何特殊的方法可以设置它…您只需分配给它…如果可能,我会使用
errno.h
中定义的给定枚举值。该列表不太完整,EILSEQ
是标准强制要求的。@prelic我关于设置它的问题来自这样一个事实,即它是一个使用宏实现的特定于线程的全局变量+1表示枚举值(当然,如果您想要有意义的值,则需要严格使用该值!)@R。。当我读到更多的时候,我发现…不确定那篇文章是否过时或只是错了。errno
几乎被POSIX中的所有函数使用(除了返回错误代码和一些奇怪的异常的函数),而不仅仅是低级的东西。对于errno
和C标准,你想知道的远不止这些,请看,它一点也不奇怪:-)标准声明它扩展为可修改的左值。