为什么C语言中的"errno"类型是`int`而不是`unsigned int`?

3

我刚接触C语言,关于全局整型变量errno的问题:它的类型是int,取值范围是1到124,既然它的值不能为负数,那么为什么它的类型不是unsigned int呢?


1
谁说值的范围是1-106? - undefined
4
这可能源于很久以前的预标准C语言中,除非另有说明,否则所有内容都默认为“int”类型。因此,有许多取值是“int”类型。您也可以问同样的问题,“main()”既然不能向shell返回负值,为什么不是“unsigned main()”?很可能是相同的原因。 - undefined
2
http://www.ioplex.com/~miallen/errcmp.html - 不是每个人都使用相同的错误编号 - undefined
5
我认为原因很简单 - 无符号整数直到1973年才被加入C语言,可能是在errno创建之后。API中还有其他一些地方事后看来应该是无符号的,但实际上不是,其中一些已经在多年中进行了清理。 - undefined
1
我本来想添加 [tag:history] 标签,但是它说计算机历史问题是不适合讨论的。这是否意味着这个问题应该被关闭?如果不是的话,@EricS 应该把他们的评论发表为一个答案。 - undefined
显示剩余6条评论
1个回答

2
许多C语言中的东西都是出于传统而使用int类型,而不是因为某种理由。在恐龙行走地球时代,C语言没有很好的类型系统,但将所有东西都视为int类型。随着语言的发展和最终的标准化,类型系统变得不那么粗糙,但很多旧函数保留了int类型的API。(例如还有另一个旧的int常量EOF,这反过来影响了很多函数的API,如getcharctype.h函数。)
至于errno定义的位置和它的类型,请参见C17 7.5(errno.h)

errno
扩展为具有类型int和线程本地存储持续时间的可修改lvalue

关于其值的唯一保证是:

程序初始线程中errno的值为零,但任何库函数都不会将其设置为零。库函数调用可能会将errno的值设置为非零值...

请注意,它所说的是非零而不是正数。有一些预定义的宏,如EDOM、EILSEQ、ERANGE,保证是正int,但errno不仅限于这些值。实现(编译器和系统)可能定义更多的值,如Linux等。你提到的1到124的范围是特定于Linux的,但C中没有阻止其他实现使用不同的范围或负数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接