为什么在 dirent.h 中说 "We must not include limits.h!"?

Why does it say "We must not include limits.h!" in dirent.h?

当我们将<dirent.h><limits.h>包含到c文件中时,dirent结构的d_name变量在[=中的变量描述中显示We must not include limits.h! 26=]。当我查看文件 /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。我在网上搜索过,但找不到满意的答案。

每个标准 header 都有关于它公开或可能公开的内容的规范。 dirent.h暴露了struct direntDIR以及相关函数,并保留了d_开头的名称。一些 header 也被允许但不要求暴露某些其他 header 暴露的东西; dirent.h 不是其中之一。因此,间接包含 limits.h 将违反命名空间,并且会破坏假定它们可以使用 limits.h 会为自己的标识符公开的名称的符合规范的程序。

文件名(组件)的最大字符数为 NAME_MAX。数字 256 等于 NAME_MAX + 1(或者是任何目标系统上的最大值)。自然而然地使用像这样的裸幻数通常是不受欢迎的。

但该宏仅在 <limits.h> 中定义。它不能包含在 <dirent.h> 中,因为后者不应该定义任何这些宏。

此外,可能无法保证定义 NAME_MAX 等值。

Per POSIX <limits.h>(加粗我的):

The values in the following list may be constants within an implementation or may vary from one pathname to another. For example, file systems or directories may have different characteristics.

A definition of one of the values shall be omitted from the <limits.h> header on specific implementations where the corresponding value is equal to or greater than the stated minimum, but where the value can vary depending on the file to which it is applied. The actual value supported for a specific pathname shall be provided by the pathconf() function.

...

{PATH_MAX}

Maximum number of bytes in a pathname, including the terminating null character.

Minimum Acceptable Value: {_POSIX_PATH_MAX}

Minimum Acceptable Value: {_XOPEN_PATH_MAX}

如评论中所述,Linux 支持具有不同最大路径名长度的文件系统。