用gcc可以编译,用g++编译出错?

时间:2021-10-30 09:14:44
代码如下:

/*----------------------源代码开始--------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
/*********************************************************************
*filename: cycletcpserver.c
*purpose: 循环tcp服务端程序
*tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2006-07-04 22:00:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to: Google.com
*********************************************************************/
int main(int argc, char ** argv)
{
int sockfd,new_fd; /* 监听socket: sock_fd,数据传输socket: new_fd */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in their_addr; /* 客户地址信息 */
unsigned int sin_size, myport, lisnum;
if(argv[1])  myport = atoi(argv[1]);
else myport = 7838;
if(argv[2])  lisnum = atoi(argv[2]);
else lisnum = 2;
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
my_addr.sin_family=PF_INET;
my_addr.sin_port=htons(myport);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 0);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind");
exit(1);
}
if (listen(sockfd, lisnum) == -1) {
perror("listen");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
perror("accept");
continue;
}
printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));
if (!fork()) { /* 子进程代码段 */
if (send(new_fd, "Hello, world!\n", 14, 0) == -1) {
perror("send");
close(new_fd);
exit(0);
}
}
close(new_fd); /*父进程不再需要该socket*/
waitpid(-1,NULL,WNOHANG);/*等待子进程结束,清除子进程所占用资源*/
}
}
/*----------------------源代码结束--------------------------------------------*/


用gcc编译:gcc -o server.o server.c
没有问题
用g++编译:g++ -o server.o server.c
server.c:11: error: ISO C++ forbids declaration of ‘decompress’ with no type
server.c: In function ‘int main(int, char**)’:
server.c:46: error: ‘inet_ntoa’ was not declared in this scope
server.c:47: error: ‘fork’ was not declared in this scope
server.c:50: error: ‘close’ was not declared in this scope
server.c:55: error: ‘close’ was not declared in this scope

3 个解决方案

#1


C++要求函数在使用前必须先有声明。这样可以在编译时找到更多的错误。
C在这一点上(还有很多其它地方)要求不太严格,如果一个函数未经声明就使用了,C编译器会认为这就是声明。这样容易通过编译,但是如果在运行的时候出现问题更让人头疼。
用gcc -Wall server.c编译,会给出warning。

用man找到几个函数所在的头文件,include就可以了。
#include <unistd.h> // fork, close
#include <arpa/inet.h>  // inet_ntoa

#2


没包含头文件。
GCC没有G++头文件要求严格

#3


进来学习!~o(∩_∩)o...

#1


C++要求函数在使用前必须先有声明。这样可以在编译时找到更多的错误。
C在这一点上(还有很多其它地方)要求不太严格,如果一个函数未经声明就使用了,C编译器会认为这就是声明。这样容易通过编译,但是如果在运行的时候出现问题更让人头疼。
用gcc -Wall server.c编译,会给出warning。

用man找到几个函数所在的头文件,include就可以了。
#include <unistd.h> // fork, close
#include <arpa/inet.h>  // inet_ntoa

#2


没包含头文件。
GCC没有G++头文件要求严格

#3


进来学习!~o(∩_∩)o...