我正在读一本有关用C语言进行网络编程的书。其中一个示例程序(此处:https://github.com/codeplea/Hands-On-Network-Programming-with-C/blob/master/chap01/unix_list.c)将sa_family类型(它是无符号整数)与我猜测的枚举数进行了比较, AF_INET和AF_INET6。这是如何运作的?
我一直在查看socket.h和ifaddrs.h,但其中没有看到任何枚举。
int main() {
struct ifaddrs *addresses;
if (getifaddrs(&addresses) == -1) {
printf("getifaddrs call failed\n");
return -1;
}
struct ifaddrs *address = addresses;
while(address) {
int family = address->ifa_addr->sa_family;
if (family == AF_INET || family == AF_INET6) {
printf("%s\t", address->ifa_name);
printf("%s\t", family == AF_INET ? "IPv4" : "IPv6");
char ap[100];
const int family_size = family == AF_INET ?
sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
getnameinfo(address->ifa_addr,
family_size, ap, sizeof(ap), 0, 0, NI_NUMERICHOST);
printf("\t%s\n", ap);
}
address = address->ifa_next;
}
freeifaddrs(addresses);
return 0;
}
第13行如何工作?如果(家庭== AF_INET ||家庭== AF_INET6)
谢谢!
答案 0 :(得分:1)
您找不到任何枚举的原因是因为AF_INET
和AF_INET6
不是“枚举器”。
但是您要查看的头文件是sys/socket.h
。在其中,您会找到:
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
...
#define AF_INET6 30 /* IPv6 */
换句话说,AF_INET
和AF_INET6
是数字-实际上是整数,就像sa_family
类型一样。
知道它们是整数,我猜您现在可以确切地看到
if (family == AF_INET || family == AF_INET6)
有效。
答案 1 :(得分:1)
Posix实际上specifies AF_INET是宏,因此在特定平台上,AF_INET可以定义为例如
#define AF_INET 16
这样的代码
if (family == AF_INET)
在预处理程序阶段之后将转换为字面上的代码if (family == 16)
如果是枚举,则没有太大的区别。
枚举只是一个整数,因此您可以将其与整数类型的变量进行比较。
假设有
enum SA_FAMILY {
AF_INET,
AF_INET6
AF_UNIX
};
在这里,第一个枚举常量将具有整数值0,第二个枚举常量将具有值1,依此类推。
这意味着您可以将枚举常量与一个整数类型的变量进行比较(并且所谓的“通常的算术转换”规则规定了在各种情况下如何转换值,无论您是否使用{{ 1}},short int
等。)
如果有
unsigned int
您也只是在做unsigned int family = 0;
if (family == AF_INET) {
...
}
。
答案 2 :(得分:0)
if (family == AF_INET || family == AF_INET6)
表示“如果family
等于AF_INET
或family
等于AF_INET6
”。等于运算符的优先级高于逻辑或运算符。