很多同学在初学socket编程的时候,编译书上的第一个例子程序都会遇到这样一个问题,明明头文件都包含了,为什么编译总是报错:
'sockaddr_in' undeclared
'sockaddr' undeclared.
原因如下:
如果用gcc client.c -o client -Wall编译,则
struct sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(struct sockaddr_in));
connect(sockfd, (struct sockaddr)&sockAddr, sizeof(sockAddr));
这3个地方的struct关键字都不能省略,否则编译报错说没有声明。
如果用g++ client.c -o client -Wall编译,则这3个地方的struct关键字都可以省略。
因为g++命令与gcc -libstdc++等效,所以我判断这个区别不是编译器造成的,而是C和C++语言的细小差别。
C++设计的一个目标就是自定义类可以像内置类型一样使用,在使用自定义类型时关键字class和struct是可以省略的。