gcc编译遇到的编译问题

恋喵大鲤鱼
博客专家认证
2015-09-05 04:43:33
使用gcc编译c文件出现的错误:
gcc -std=c99 getIP.c
getIP.c: In function ‘main’:
getIP.c:11: warning: initialization makes integer from pointer without a cast
getIP.c:12: warning: implicit declaration of function ‘gethostname’
getIP.c:18: warning: implicit declaration of function ‘getaddrinfo’
getIP.c:19: error: dereferencing pointer to incomplete type
getIP.c:21: error: dereferencing pointer to incomplete type
getIP.c:23: error: dereferencing pointer to incomplete type

换成g++编译没有任何问题:
g++ -std=c++0x getIP.c

这是为什么?

源码:
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

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

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

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

int main(int argc,char* argv[])
{
char host_name[128]={NULL};
gethostname(host_name, sizeof(host_name));
printf("host_name:%s\n",host_name);

struct addrinfo *ailist=NULL,*aip=NULL;
struct sockaddr_in *saddr;
char *addr;
int ret=getaddrinfo(host_name,"ftp",NULL,&ailist);
for(aip=ailist; aip!=NULL; aip=aip->ai_next)
{
if(aip->ai_family==AF_INET)
{
saddr=(struct sockaddr_in*)aip->ai_addr;
addr=inet_ntoa(saddr->sin_addr);
}
printf("addr:%s\n",addr);
}
getchar();
return 0;
}
...全文
204 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
恋喵大鲤鱼 2015-09-10
  • 打赏
  • 举报
回复
引用 7 楼 q3733353520 的回复:
[quote=引用 6 楼 q3733353520 的回复:] [quote=引用 5 楼 K346K346 的回复:] [quote=引用 4 楼 q3733353520 的回复:] getIP.c:19: error: dereferencing pointer to incomplete type 这个就是 #include <netinet/in.h>
按照您的说法,我加了这个头文件,gcc编译依然会报同样的错误,还有什么解决办法吗? [/quote]

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

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

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>


int main(int argc,char* argv[])
{
	char host_name[128]={0};//这里要这样初始化
	gethostname(host_name, sizeof(host_name));
	printf("host_name:%s\n",host_name);

	struct addrinfo *ailist=NULL,*aip=NULL;
	struct sockaddr_in *saddr;
	char *addr;
	int ret=getaddrinfo(host_name,"ftp",NULL,&ailist);
	for(aip=ailist; aip!=NULL; aip=aip->ai_next)
	{
		if(aip->ai_family==AF_INET)
		{
			saddr=(struct sockaddr_in*)aip->ai_addr;
			addr=inet_ntoa(saddr->sin_addr);
		}
		printf("addr:%s\n",addr);
	}
	getchar();
	return 0;
} 
我在ubuntu14.04下编译运行都没报错[/quote] 哦,忘了加c99的参数,我猜测getaddrinfo gethostname struct addrinfo 的定义并不在c99标准中[/quote] 是啊,本想放弃的,我去掉了-std=c99这个编译选项后,就可以顺利编译了。果然这个原因,谢谢一直的关注和解答!!! IT届因你二温暖。
恋喵大鲤鱼 2015-09-10
  • 打赏
  • 举报
回复
引用 7 楼 q3733353520 的回复:
[quote=引用 6 楼 q3733353520 的回复:] [quote=引用 5 楼 K346K346 的回复:] [quote=引用 4 楼 q3733353520 的回复:] getIP.c:19: error: dereferencing pointer to incomplete type 这个就是 #include <netinet/in.h>
按照您的说法,我加了这个头文件,gcc编译依然会报同样的错误,还有什么解决办法吗? [/quote]

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

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

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>


int main(int argc,char* argv[])
{
	char host_name[128]={0};//这里要这样初始化
	gethostname(host_name, sizeof(host_name));
	printf("host_name:%s\n",host_name);

	struct addrinfo *ailist=NULL,*aip=NULL;
	struct sockaddr_in *saddr;
	char *addr;
	int ret=getaddrinfo(host_name,"ftp",NULL,&ailist);
	for(aip=ailist; aip!=NULL; aip=aip->ai_next)
	{
		if(aip->ai_family==AF_INET)
		{
			saddr=(struct sockaddr_in*)aip->ai_addr;
			addr=inet_ntoa(saddr->sin_addr);
		}
		printf("addr:%s\n",addr);
	}
	getchar();
	return 0;
} 
我在ubuntu14.04下编译运行都没报错[/quote] 哦,忘了加c99的参数,我猜测getaddrinfo gethostname struct addrinfo 的定义并不在c99标准中[/quote]
引用 7 楼 q3733353520 的回复:
[quote=引用 6 楼 q3733353520 的回复:] [quote=引用 5 楼 K346K346 的回复:] [quote=引用 4 楼 q3733353520 的回复:] getIP.c:19: error: dereferencing pointer to incomplete type 这个就是 #include <netinet/in.h>
按照您的说法,我加了这个头文件,gcc编译依然会报同样的错误,还有什么解决办法吗? [/quote]

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

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

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>


int main(int argc,char* argv[])
{
	char host_name[128]={0};//这里要这样初始化
	gethostname(host_name, sizeof(host_name));
	printf("host_name:%s\n",host_name);

	struct addrinfo *ailist=NULL,*aip=NULL;
	struct sockaddr_in *saddr;
	char *addr;
	int ret=getaddrinfo(host_name,"ftp",NULL,&ailist);
	for(aip=ailist; aip!=NULL; aip=aip->ai_next)
	{
		if(aip->ai_family==AF_INET)
		{
			saddr=(struct sockaddr_in*)aip->ai_addr;
			addr=inet_ntoa(saddr->sin_addr);
		}
		printf("addr:%s\n",addr);
	}
	getchar();
	return 0;
} 
我在ubuntu14.04下编译运行都没报错[/quote] 哦,忘了加c99的参数,我猜测getaddrinfo gethostname struct addrinfo 的定义并不在c99标准中[/quote] 真的不行,很无奈,我是在Red Hat Enterprise Linux Server release 6.4环境下编译的,还是不行,哎,有点想放弃的冲动。无奈啊,为什么????????
  • 打赏
  • 举报
回复
引用 6 楼 q3733353520 的回复:
[quote=引用 5 楼 K346K346 的回复:] [quote=引用 4 楼 q3733353520 的回复:] getIP.c:19: error: dereferencing pointer to incomplete type 这个就是 #include <netinet/in.h>
按照您的说法,我加了这个头文件,gcc编译依然会报同样的错误,还有什么解决办法吗? [/quote]

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

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

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>


int main(int argc,char* argv[])
{
	char host_name[128]={0};//这里要这样初始化
	gethostname(host_name, sizeof(host_name));
	printf("host_name:%s\n",host_name);

	struct addrinfo *ailist=NULL,*aip=NULL;
	struct sockaddr_in *saddr;
	char *addr;
	int ret=getaddrinfo(host_name,"ftp",NULL,&ailist);
	for(aip=ailist; aip!=NULL; aip=aip->ai_next)
	{
		if(aip->ai_family==AF_INET)
		{
			saddr=(struct sockaddr_in*)aip->ai_addr;
			addr=inet_ntoa(saddr->sin_addr);
		}
		printf("addr:%s\n",addr);
	}
	getchar();
	return 0;
} 
我在ubuntu14.04下编译运行都没报错[/quote] 哦,忘了加c99的参数,我猜测getaddrinfo gethostname struct addrinfo 的定义并不在c99标准中
  • 打赏
  • 举报
回复
引用 5 楼 K346K346 的回复:
[quote=引用 4 楼 q3733353520 的回复:] getIP.c:19: error: dereferencing pointer to incomplete type 这个就是 #include <netinet/in.h>
按照您的说法,我加了这个头文件,gcc编译依然会报同样的错误,还有什么解决办法吗? [/quote]

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

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

#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>


int main(int argc,char* argv[])
{
	char host_name[128]={0};//这里要这样初始化
	gethostname(host_name, sizeof(host_name));
	printf("host_name:%s\n",host_name);

	struct addrinfo *ailist=NULL,*aip=NULL;
	struct sockaddr_in *saddr;
	char *addr;
	int ret=getaddrinfo(host_name,"ftp",NULL,&ailist);
	for(aip=ailist; aip!=NULL; aip=aip->ai_next)
	{
		if(aip->ai_family==AF_INET)
		{
			saddr=(struct sockaddr_in*)aip->ai_addr;
			addr=inet_ntoa(saddr->sin_addr);
		}
		printf("addr:%s\n",addr);
	}
	getchar();
	return 0;
} 
我在ubuntu14.04下编译运行都没报错
恋喵大鲤鱼 2015-09-08
  • 打赏
  • 举报
回复
引用 4 楼 q3733353520 的回复:
getIP.c:19: error: dereferencing pointer to incomplete type 这个就是 #include <netinet/in.h>
按照您的说法,我加了这个头文件,gcc编译依然会报同样的错误,还有什么解决办法吗?
恋喵大鲤鱼 2015-09-07
  • 打赏
  • 举报
回复
引用 1 楼 q3733353520 的回复:
g++是c++的编译器, 头文件包含不一样
请问这个头文件不一样是哪里不一样,在我的代码中,但是也没有报什么头文件的错误啊!
  • 打赏
  • 举报
回复
getIP.c:19: error: dereferencing pointer to incomplete type 这个就是 #include <netinet/in.h>
zeloas 2015-09-06
  • 打赏
  • 举报
回复
不同标准里面对语法的界定有一定的不同的
  • 打赏
  • 举报
回复
g++是c++的编译器, 头文件包含不一样

18,829

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧