c-如果未直接访问,则包含errno



即使我不直接访问errno,我也需要包括errno.h吗?例如

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

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

如果只使用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时才需要<errno.h>。注意,sys_errlistsys_nerr是BSD扩展。

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

7.19.10.4错误函数

简介

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

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

7.5错误

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

2宏是

EDOM
EILSEQ
ERANGE

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

errno

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

[…]

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

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

所以这里没有任何东西需要errno.h

最新更新