【问题标题】:Why the type of "errno" in C is `int` rather than `unsigned int`?为什么 C 中“errno”的类型是 `int` 而不是 `unsigned int`?
【发布时间】:2020-09-08 04:54:54
【问题描述】:

我是C新手,只是一个关于全局整数变量errno的问题,errno的类型是int,它的取值范围是1到124,因为这个值不能是负数,那么为什么它的类型是int 而不是unsigned int

【问题讨论】:

  • 谁说取值范围是1-106?
  • @secondimage C 标准只需要定义 3 个 errno 代码。实现添加自己的,因此没有设定范围。
  • 这可能源于很久以前在准标准 C 中,除非另有说明,否则所有内容都默认为 int。由于这个原因,有许多类型为int 的值。对于main(),你也可以问同样的问题,既然你不会向shell 返回负值,那为什么不是unsigned main()?可能是同样的原因。
  • ioplex.com/~miallen/errcmp.html - 不是每个人都使用相同的错误码
  • 我认为原因很简单——无符号整数直到 1973 年才成为 C 语言的一部分,可能是在创建 errno 之后。 API 中还有其他一些地方事后看来应该是未签名的,但实际上并没有,其中一些地方已经被清理了多年。

标签: c errno


【解决方案1】:

C 中的很多东西int 是出于传统,而不是因为某些原因。回到恐龙在地球上行走的时代,C 没有太多的类型系统,而是将所有内容都视为int。随着语言的发展和最终标准化,类型系统变得不那么粗糙,但许多旧函数为它们的 API 保留了int 类型。 (例如还有一个这么老的int常量EOF,这反过来又影响了很多函数的API,比如getcharctype.h函数。)

至于errno在哪里定义,得到什么类型,见C17 7.5 (errno.h)

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

对其价值的唯一保证是:

程序启动时初始线程中errno的值为零/-/ 但绝不会被任何库函数设置为零。 errno 的值可以通过库函数调用设置为非零...

注意它说的是nonzero,而不是positive。有一些预定义的宏,如EDOMEILSEQERANGE,保证为正值int,但errno 并不仅限于这些值。实现(编译器和系统)可以定义更多的值,如 Linux 等中所见。您所说的范围 1 到 124 是特定于 Linux 的,但 C 中没有任何内容阻止其他实现使用不同的范围或负数。

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2016-02-26
    • 2011-11-21
    • 1970-01-01
    • 2022-07-22
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多