• C/C++结构体成员偏移量获取


    分析代码节选自muduo.

    以下代码通过offsetof获取sin_familysockaddr_in6中的字段偏移量.

    static_assert(offsetof(sockaddr_in6, sin6_family) == 0, "sin6_family offset 0");

    需要注意:

    offsetof并非C/C++标准,需要编译器内置支持.

    以及针对的数据类型,尽量使POD类型数据(可参考下面链接中的提示).

    具体详情可参考:https://en.cppreference.com/w/cpp/types/offsetof

    补充:检查sin_family6字段时发现其是通过宏拼接而成,颇为有趣,代码如下所示:

     1 //拼接宏
     2 #define    __SOCKADDR_COMMON(sa_prefix) 
     3   sa_family_t sa_prefix##family
     4 
     5 //结构体定义
     6 #if !__USE_KERNEL_IPV6_DEFS
     7 /* Ditto, for IPv6.  */
     8 struct sockaddr_in6
     9   {
    10     __SOCKADDR_COMMON (sin6_);
    11     in_port_t sin6_port;    /* Transport layer port # */
    12     uint32_t sin6_flowinfo;    /* IPv6 flow information */
    13     struct in6_addr sin6_addr;    /* IPv6 address */
    14     uint32_t sin6_scope_id;    /* IPv6 scope-id */
    15   };
    16 #endif /* !__USE_KERNEL_IPV6_DEFS */

    PS:

    如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!

  • 相关阅读:
    html语法
    mysql常见的使用语法
    文件相关命令
    linux文件管理
    mysql常见名词解释
    MySQL初识
    文件管理
    并发基础知识3
    Bash shell初识
    【Spring Boot】ActiveMQ 发布/订阅消息模式介绍
  • 原文地址:https://www.cnblogs.com/jason1990/p/9923946.html
Copyright © 2020-2023  润新知