C/C++結構體成員偏移量獲取
阿新 • • 發佈:2018-11-07
分析程式碼節選自muduo.
以下程式碼通過offsetof獲取sin_family在sockaddr_in6中的欄位偏移量.
static_assert(offsetof(sockaddr_in6, sin6_family) == 0, "sin6_family offset 0");
需要注意:
offsetof並非C/C++標準,需要編譯器內建支援.
具體詳情可參考: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:
如果您覺得我的文章對您有幫助,可以掃碼領取下紅包,謝謝!