【问题标题】:include errno if not accessed directly如果不直接访问,则包括 errno
【发布时间】:2015-04-29 17:29:16
【问题描述】:

即使我不直接访问errno,是否也需要包含errno.h?例如。

void *mem = malloc(16384);
if (mem == NULL) {
    perror("malloc");
    exit(EXIT_FAILURE);
}

我尝试了一段不包含errno.h 的简单代码,但它工作正常,但我不确定这样做是否可以。也许errho.h 也包含在其他库中,例如stdlib.h,所以我不需要自己明确包含它?

【问题讨论】:

  • 如果您不访问任何功能,为什么需要包含它?

标签: c errno


【解决方案1】:

如果您只使用perror(),则不需要<errno.h>

来自 Linux 程序员手册

NAME
       perror - print a system error message

SYNOPSIS
       #include <stdio.h>

       void perror(const char *s);

       #include <errno.h>

       const char *sys_errlist[];
       int sys_nerr;
       int errno;

这意味着只有在使用sys_errlistsys_nerrerrno 时才需要&lt;errno.h&gt;。请注意,sys_errlistsys_nerr 是 BSD 扩展。

在 C99 标准中也可以找到类似的条目。

7.19.10.4 错误函数

概要

#include <stdio.h>
void perror(const char *s);

只有当您使用以下内容时,您才需要&lt;errno.h&gt;

7.5 错误

1 标题&lt;errno.h&gt; 定义了几个宏,都与错误情况的报告有关。

2 宏是

EDOM
EILSEQ
ERANGE

扩展为整数常量表达式 键入int,不同的正值,适用于 #if 预处理指令;和

errno

扩展为具有int类型的可修改左值175),其值设置为正 几个库函数的错误号。

[...]

4 其他宏定义,以E 和一个数字或E 和一个数字开头 大写字母,177) 也可以由实现指定。

【讨论】:

    【解决方案2】:
    • malloc() 需要 stdlib.h
    • perror() 需要 stdio.h
    • exit() 需要 stdlib.h

    所以这里不需要 errno.h

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2018-10-29
      • 2011-04-20
      相关资源
      最近更新 更多