c - 查询有关套接字编程头文件中使用的语法

标签 c sockets

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

/* 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/

相关文章:

c - 声明一个字符数组 VS 在 C 中为字符数组动态分配空间

c - V7 Echo 程序递增一个常量指针,如何?

c - 通过结构体类型的指针向结构体成员插入值

sockets - Nodejs : How to catch exception in net. createServer.on ("data",...)?

c - 通过C中的套接字传递具有整数数组的结构

c - 将客户端绑定(bind)到本地端口

客户端在 2-3 次成功连接后停止与服务器的连接。 c 中的套接字编程

c - 包含两个双指针的结构体,访问第二个双指针时出现段错误

c - 在 C 中使用不同的库

RAW套接字可以绑定(bind)到ip :port instead of an interface?吗