如果不直接访问,则包括errno

时间:2015-04-29 17:29:17

标签: c errno

即使我没有直接访问errno.h,我是否需要加入errno?例如

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

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

2 个答案:

答案 0 :(得分:3)

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

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;

这意味着只有在您使用<errno.h>sys_errlistsys_nerr时才需要errno。请注意,sys_errlistsys_nerr是BSD扩展。

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

  

7.19.10.4 perror功能

     

概要

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

只有在使用以下内容时才需要<errno.h>

  

7.5错误

     

1标题<errno.h>定义了几个宏,所有宏都与报告错误条件有关。

     

2宏是

EDOM
EILSEQ
ERANGE
     

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

errno
     

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

     

[...]

     

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

答案 1 :(得分:2)

  • malloc()需要stdlib.h
  • perror()需要stdio.h
  • exit()需要stdlib.h

所以这里没有什么需要errno.h