【发布时间】:2019-10-20 21:25:10
【问题描述】:
当我尝试编译我的代码时出现以下错误:
main.c:13:40: note: each undeclared identifier is reported only once for each function it appears in
main.c:17:14: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function); did you mean ‘EAI_FAMILY’?
case EAI_ADDRFAMILY:
^~~~~~~~~~~~~~
EAI_FAMILY
main.c:29:14: error: ‘EAI_NODATA’ undeclared (first use in this function); did you mean ‘EAI_NONAME’?
case EAI_NODATA:
^~~~~~~~~~
EAI_NONAME
我尝试过包含不同的标头(例如netinet/in.h)以及使用不同的标准(gnu90、gnu99、gnu11)进行编译,但似乎没有任何方法可以解决错误。
以下是我的代码:
// Name: main.c
// Compile: gcc -std=gnu11 main.c
// Error:
// main.c: In function ‘main’:
// main.c:18:14: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function); did you mean ‘EAI_FAMILY’?
// case EAI_ADDRFAMILY:
// ^~~~~~~~~~~~~~
// EAI_FAMILY
// main.c:18:14: note: each undeclared identifier is reported only once for each function it appears in
// main.c:30:14: error: ‘EAI_NODATA’ undeclared (first use in this function); did you mean ‘EAI_NONAME’?
// case EAI_NODATA:
// ^~~~~~~~~~
// EAI_NONAME
#include <stddef.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int main()
{
struct addrinfo* res;
char* domain = "google.com";
switch(getaddrinfo(domain, "http", NULL, &res))
{
case 0:
break;
case EAI_ADDRFAMILY:
break;
case EAI_AGAIN:
break;
case EAI_BADFLAGS:
break;
case EAI_FAIL:
break;
case EAI_FAMILY:
break;
case EAI_MEMORY:
break;
case EAI_NODATA:
break;
case EAI_NONAME:
break;
case EAI_SERVICE:
break;
case EAI_SOCKTYPE:
break;
}
return 0;
}
【问题讨论】:
-
好的,我搜索了一下,确实手册页指出上述定义应该在
netdb.h中。但是,它们至少不适用于我系统上的标头和 the open group 的标头,而且似乎也是您的标头。然而,它们是在addrinfo.h中定义的,但这会产生关于多重定义的冲突。这就是困扰我的地方,有时手册页只是一团混乱 -
嗯,当我在我的系统上检查
netdb.h时,它似乎确实在那里,但只有在定义__USE_GNU时。我得看看那个标志是怎么启用的。 -
另外,您可以使用
gai_strerror()将任何返回的结果转换为可读的字符串以进行错误输出。然而,这意味着您不能对错误做出反应,只能对消息做出反应并退出。 -
请参阅 this answer 以自行启用 __USE_GNU
-
Take a look here 我有时发现使用 posix 函数非常困难,因为纪录片有时是如此模棱两可,而我以前从未使用过
_GNU_SOURCE。
标签: c tcp network-programming getaddrinfo