包含 <limits.h> 后未定义 HOST_NAME_MAX

Posted

技术标签:

【中文标题】包含 <limits.h> 后未定义 HOST_NAME_MAX【英文标题】:HOST_NAME_MAX undefined after include <limits.h> 【发布时间】:2015-05-06 17:51:23 【问题描述】:

我不知道为什么它仍然说 HOST_NAME_MAX 是隐式声明。

相反,我搜索了网络并执行以下操作来修复它:

#include <netdb.h>

并使用MAXHOSTNAMELEN 而不是HOST_NAME_MAX

但是,我不太确定这是一个好方法,以及它背后的原因。

【问题讨论】:

HOST_NAME_MAX 未在 &lt;limits.h&gt; 中定义。为什么会这样? @Keith 那么它是在哪里定义的呢?我已经检查过了,它似乎已定义 link 对不起,我的错误。它&lt;limits.h&gt; 中定义的,但不是默认的。 (它由 POSIX 指定,而不是由 C 指定)。有一种方法可以指定您希望 &lt;limits.h&gt; 定义它,但我不记得它了。 @KeithThompson 谢谢!我会尝试搜索并查看其他人的想法...... 【参考方案1】:

使用grep

$ grep -rl '#define HOST_NAME_MAX' /usr/include

我们可以看到HOST_NAME_MAX定义在:

/usr/include/bits/local_lim.h

local_lim.h 包含在/usr/include/bits/posix1_lim.h 中:

# grep -rl local_lim.h /usr/include
/usr/include/bits/posix1_lim.h

只有在定义了__USE_POSIX 时,limits.h 才会包含 posix1_lim.h

#ifdef  __USE_POSIX
/* POSIX adds things to <limits.h>.  */
# include <bits/posix1_lim.h>
#endif

所以如果你的代码看起来像:

#define __USE_POSIX
#include <limits.h>

您应该有可用的HOST_NAME_MAX 常量。话虽如此,在我的系统上__USE_POSIX 似乎是默认定义的。例如以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <limits.h>

int main(int argc, char **argv) 
#ifdef __USE_POSIX
  printf("__USE_POSIX is defined\n");
#endif
  printf("HOST_NAME_MAX: %d\n", HOST_NAME_MAX);
  return 0;

打印:

__USE_POSIX is defined
HOST_NAME_MAX: 64

【讨论】:

我可以看到它像您发布的那样实现,但是从pubs.opengroup.org/onlinepubs/009695399/functions/… 我可以看到根据标准应该使用 _POSIX_C_SOURCE 而不是 __USE_POSIX。这不起作用(因为它不是这样编码的)。你知道为什么不使用 _POSIX_C_SOURCE 编码吗? 在做进一步调查后,因为在查看“posix1_lim.h”时它对我不起作用,我发现有些东西已经改变了 HOST_NAME_MAX 现在是 _POSIX_HOST_NAME_MAX LOGIN_NAME_MAX 现在是 _POSIX_LOGIN_NAME_MAX pastebin.com/kFmAbWcJ

以上是关于包含 <limits.h> 后未定义 HOST_NAME_MAX的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 变量在传递给另一个组件后未定义

C语言 "limits.h" 数据类型的界限值

C库文件操作函数

《C程序设计语言》笔记 (十五) 参考手册7

结构体优先队列的用法

为什么很多人使用#define而不是const定义常量