2015-04-29 3 views
3

Нужно ли включать errno.h, даже если у меня нет доступа errno? Например.включают errno, если они не доступны напрямую

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

Я попытался простой кусок кода, как это, не включая errno.h, и она работала, но я не уверен, если это нормально, чтобы сделать это. Возможно, errho.h также включен в другие библиотеки, такие как stdlib.h, и поэтому мне не нужно явно включать его сам?

+1

Если вы не получить доступ к любой функциональности, почему бы вам нужно включить его? – Daniel

ответ

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_errlist, sys_nerr или errno. Обратите внимание, что sys_errlist и sys_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 

, которая расширяется до модифицируемых именующее 175), что имеет тип int, значение которого установлено в положительное число ошибок несколько функций библиотеки.

[...]

Дополнительные макроопределения, начиная с E и цифры или E и заглавной буквы, 177) могут также быть определены реализацией.

2
  • malloc() требует stdlib.ч
  • PError() требует stdio.h
  • выхода() требует stdlib.h

Так что ничего здесь не требует errno.h