Почему говорится "Мы не должны включать пределы. Ч!"в dirent.h? - PullRequest
5 голосов
/ 16 октября 2019

Когда мы включаем <dirent.h> и <limits.h> в файл переменного тока, dirent Structs 'd_name переменная показывает We must not include limits.h! в описании переменной в ide. Когда я смотрю на файл / usr / include / x86_64-linux-gnu / bits / dirent.h , он содержит следующий фрагмент кода.

...
struct dirent
  {
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;
    __off_t d_off;
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];       /* We must not include limits.h! */
  };
...

У меня вопрос, почему мы должныне включает limits.h. Я искал в Интернете, но не смог найти удовлетворительного ответа.

Ответы [ 3 ]

5 голосов
/ 16 октября 2019

Каждый стандартный заголовок имеет спецификацию того, что он предоставляет или может предоставлять. dirent.h предоставляет struct dirent, DIR и соответствующие функции и резервирует имена, начинающиеся с d_. Некоторым заголовкам также разрешено, но не требуется выставлять вещи, выставленные некоторыми другими заголовками;dirent.h не является одним из них. Таким образом, косвенное включение limits.h будет нарушением пространства имен и нарушит работу соответствующих программ, предполагающих, что они могут использовать имена, которые limits.h предоставит для своих собственных идентификаторов.

1 голос
/ 17 октября 2019

Кроме того, такие значения, как NAME_MAX, могут быть гарантированно не определены.

На POSIX <limits.h> (шахтный шов):

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

Определение одного из значений должно быть опущено в заголовке <limits.h> в конкретных реализациях, где соответствующее значение равноили больше указанного минимума, но значение может варьироваться в зависимости от файла, к которому оно применяется. Фактическое значение, поддерживаемое для конкретного имени пути, должно быть предоставлено функцией pathconf().

...

{PATH_MAX}

Максимальное количество байтов в имени пути,включая завершающий нулевой символ.

Минимально допустимое значение: {_POSIX_PATH_MAX}

Минимально допустимое значение: {_XOPEN_PATH_MAX}

Как отмечено в комментариях, Linux поддерживает файловые системыс разными максимальными длинами пути.

1 голос
/ 17 октября 2019

Максимальное количество символов в имени файла (компонента) составляет NAME_MAX. Число 256 равно NAME_MAX + 1 (или является максимальным значением в любой целевой системе). Естественно, использование голого магического числа, подобного этому, обычно вызывает недовольство.

Но этот макрос определен только в <limits.h>. Он не может быть включен в <dirent.h>, поскольку последний не должен определять ни один из этих макросов.

...