当我们将<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
。我已经在网上搜索过,但找不到满意的答案。
答案 0 :(得分:5)
每个标准标头都有其公开内容或可能公开内容的规范。 dirent.h
公开struct dirent
,DIR
和相关功能,并保留以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支持具有不同最大路径名长度的文件系统。