Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-返回负值作为无符号集errno?_C_Unsigned_Errno - Fatal编程技术网

C-返回负值作为无符号集errno?

C-返回负值作为无符号集errno?,c,unsigned,errno,C,Unsigned,Errno,你好 我正在阅读一些我被要求维护的旧代码,我看到一些函数如下: uint32_t myFunc(int* pI); 在函数体中出现错误情况时,函数通过返回负的errno值提前退出,即:return(-EINVAL) 这是标准值(即C99,ANSI),C吗?我在评论中读到,显然这样做会将errno设置为EINVAL,但我找不到任何文档支持这一点。将函数声明为带符号的int(即:int32\t myFunc(int*pI))并将负值视为错误代码,而不是试图以这种方式设置errno,这不是更好吗?解

你好

我正在阅读一些我被要求维护的旧代码,我看到一些函数如下:

uint32_t myFunc(int* pI);
在函数体中出现错误情况时,函数通过返回负的
errno
值提前退出,即:
return(-EINVAL)

这是标准值(即C99,ANSI),C吗?我在评论中读到,显然这样做会将
errno
设置为
EINVAL
,但我找不到任何文档支持这一点。将函数声明为带符号的int(即:
int32\t myFunc(int*pI)
)并将负值视为错误代码,而不是试图以这种方式设置
errno
,这不是更好吗?

解决了您的问题:这个值是标准值(即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 
“标题应定义以下宏,这些宏应
展开为int类型的整数常量表达式,不重复
正值”-errno.h dscript
“errno的值现在要求为不同的正值
而不是非零值。此更改用于与
ISO/IEC 9899:1999标准。”——错误号h变更历史第6期
可以找到一个很好的讨论(以及这些引用的来源)(搜索“何时返回EINVAL”)

解决您的问题:这个值是标准值(即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 
“标题应定义以下宏,这些宏应
展开为int类型的整数常量表达式,不重复
正值”-errno.h dscript
“errno的值现在要求为不同的正值
而不是非零值。此更改用于与
ISO/IEC 9899:1999标准。”——错误号h变更历史第6期

一个很好的讨论(以及这些引用的来源)可以找到(搜索“何时返回EINVAL”)

返回负值不会设置
错误。这是您从上下文中获取的错误信息(或者更可能是原始作者获取的):Linux内核系统调用report errors的机制返回-4095到-1范围内的负值,进行系统调用的用户空间代码随后(在大多数情况下)使用该值填充
errno
的值。但是,如果您想自己设置
errno
,只需给它赋值。

返回负值不会设置
errno
。这是您从上下文中获取的错误信息(或者更可能是原始作者获取的):Linux内核系统调用report errors的机制返回-4095到-1范围内的负值,进行系统调用的用户空间代码随后(在大多数情况下)使用该值填充
errno
的值。但是,如果您想自己设置
errno
,只需给它赋值。

我认为不会返回任何错误。。。我想你的负整数会被转换成无符号的(负整数的二进制表示形式将被用于你赋值的无符号整数),我想是这样的。用正数这个地方很奇怪。至少它违背了linux惯例。这是内核代码吗?对于这个有趣的函数,当然
myFunc()
返回值0。。。0xFFFFFF-4096是“正常”返回值,0xFFFFFFFF-4096+1。。。0xFFFFFF是“错误值”。@KeithThompson不,它不是内核代码。我认为不会返回任何错误……我认为负整数将转换为无符号(负整数的二进制表示形式将用于分配值的无符号)我想是的。使用正数这个地方很奇怪。至少它违背了linux惯例。这是内核代码吗?对于这个有趣的函数,当然
myFunc()
返回值0…0xFFFFFF-4096是“正常”返回值,0xFFFFFFFF-4096+1…0xFFFFFFFF是“错误值”。@KeithThompson不,这不是内核代码。