这是我从一个用于套接字编程的头文件中复制的一段代码。
/* 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 Preprocessor 的信息
关于c - 查询有关套接字编程头文件中使用的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829435/