为什么说“我们不能包含limits.h!”在dirent.h中?

时间:2019-10-16 20:33:10

标签: c linux header include dirent.h

当我们将<dirent.h><limits.h>包含到c文件中时,dirent结构的d_name变量在ide的变量描述中显示We must not include limits.h!。当我查看文件 /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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

文件名(组件)中的最大字符数为NAME_MAX。 256等于NAME_MAX + 1(或在任何目标系统上的最大值)。自然地,通常不喜欢使用像这样的裸魔术数字。

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

答案 2 :(得分:1)

此外,可能无法保证定义诸如, / ? : @ & = + $ #之类的值。

POSIX <limits.h>(正在炸雷):

  

以下列表中的值可以是实现中的常量,也可以从一个路径名到另一个路径名变化。例如,文件系统或目录可能具有不同的特征。

     

在特定实现上,url = url + '?passtest=' + encodeURIComponent(myVal)标头中值之一的定义应该省略,其中相应的值等于或大于规定的最小值,但是该值可以取决于要应用的文件。特定路径名支持的实际值应由NAME_MAX函数提供。

     

...

     

<limits.h>

     

路径名中的最大字节数,包括终止的空字符。

     

最低可接受值:pathconf()

     

最低可接受值:{PATH_MAX}

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