1. 程式人生 > >C/C++結構體成員偏移量獲取

C/C++結構體成員偏移量獲取

分析程式碼節選自muduo.

 

以下程式碼通過offsetof獲取sin_familysockaddr_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:

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