查询用于套接字编程的头文件中使用的语法
这是我从一个用于套接字编程的头文件中复制的代码片段。
/* Structure describing an Internet socket address. */ struct sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; };
我能理解sin_port和sin_addr的声明。 但是__SOCKADDR_COMMON in_)在这里。 我无法理解这种语法? 请解释一下。 提前致谢。
存在宏定义:
#define __SOCKADDR_COMMON(sa_prefix) \ sa_family_t sa_prefix##family
所以__SOCKADDR_COMMON (sin_);
实际上扩展为sa_family_t sin_family;
发生这种情况的方法是宏获取参数sa_prefix并使用##
运算符来连接(连接)它们。 结果是你有一个新的变量sin_family
,它在结构中用类型sa_family_t
声明。
这里有关于宏和C预处理器的更多信息
它是一个宏定义的其他地方。 它可能被定义为
#define __SOCKADDR_COMMON(sa_prefix) \ sa_family_t sa_prefix##family
扩展它,结构看起来像
struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; ...
不要将此结构复制到您的代码中。 您应该包含声明struct sockaddr_in的系统的头文件。
__SOCKADDR_COMMON()
将是一个#define
宏,它扩展了一组公共字段,用于所有结构