C/C++结构体成员偏移量获取
分析代码节选自muduo.
以下代码通过offsetof获取sin_family在sockaddr_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:
如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!