查询用于套接字编程的头文件中使用的语法

这是我从一个用于套接字编程的头文件中复制的代码片段。

/* 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宏,它扩展了一组公共字段,用于所有结构