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:

如果您覺得我的文章對您有幫助,可以掃碼領取下紅包,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM