C - 以无符号设置errno返回负值?

时间:2014-08-25 15:38:57

标签: c unsigned errno

美好的一天,

我正在阅读我要求维护的一些旧代码,并且我看到了许多类似的函数:

uint32_t myFunc(int* pI);

如果函数体内存在错误条件,则函数会通过返回负errno值来提前退出,即:return (-EINVAL);

这个值是标准的(即:C99,ANSI),C?我已在评论中读到,显然这样做会将errno设置为EINVAL,但我无法找到任何支持此文档的文档。将函数声明为signed int(即:int32_t myFunc(int* pI))并将负值视为错误代码,而不是尝试以这种方式设置errno,这不是更好吗?

2 个答案:

答案 0 :(得分:4)

返回否定值不会设置errno。这是你选择的错误信息(或者更有可能是原作者选择的)在上下文之外: Linux内核系统调用报告错误的机制在范围内返回负值-4095到-1,然后使得系统调用的用户空间代码使用(在大多数情况下)填充errno的值。但是,如果您想自己设置errno,只需为其指定一个值。

答案 1 :(得分:1)

解决你的问题:这个值是标准的(即:C99,ANSI),C?

对于C99

    "errno which expands to a modifiable lvalue that has type int, the
    value of which is set to a positive error number by several library
    functions." -- N1256 7.5p2

对于POSIX

    "The <errno.h> header shall define the following macros which shall
    expand to integer constant expressions with type int, distinct
    positive values" -- errno.h DSCRIPTION

    "Values for errno are now required to be distinct positive values
    rather than non-zero values. This change is for alignment with the
    ISO/IEC 9899:1999 standard." -- errno.h CHANGE HISTORY Issue 6 

HERE (搜索&#34;何时返回EINVAL&#34;)< / p>