问题描述
我是C语言的新手,只是一个关于全局整数变量errno
的问题,errno
的类型为int
,其值范围为1到124,因为该值可以不是负数,那为什么它的类型是int
而不是unsigned int
?
解决方法
C中的许多事情int
都是不合常规的,而不是出于某种原因。早在恐龙走过地球的时代,C并没有太多的类型系统,而是将所有内容都视为int
。随着语言的发展并最终实现标准化,类型系统的使用不再那么粗糙,但是许多旧函数为其API保留了int
类型。 (例如,还有一个这样的旧int
常量EOF
,这反过来又影响了诸如getchar
和ctype.h
函数之类的许多函数的API。)
关于errno
的定义和类型,请参阅C17 7.5(errno.h)
errno
扩展为具有类型int
和线程本地存储的可修改左值 持续时间
关于其价值的唯一保证是:
程序启动时,初始线程中
errno
的值为零/-/ 但绝不会通过任何库函数将其设置为零。可以通过库函数调用将errno
的值设置为非零...
请注意,它表示为 nonzero ,而不是 positive 。有一些预定义的宏,例如EDOM
,EILSEQ
,ERANGE
,可以保证它们为正数int
,但是errno
不仅限于这些价值观。如Linux等所示,该实现(编译器和系统)可能会定义更多值。您所说的范围1到124特定于Linux,但C语言中的任何内容都不能阻止其他实现使用不同的范围或负数。