2009-05-23 28 views
1

我正在嘗試爲D編程 語言創建一個圍繞libdnet的包裝。我碰到的問題是不知道什麼 強調eth_addr_t,ip_addr_t和ip6_addr_t的類型,而 轉換addr.h。最後一個神祕類型是sockaddr什麼是eth_addr_t和libdnet中的朋友

而且我也很感興趣,爲什麼有一個while while循環總是假的。

#define addr_pack(addr, type, bits, data, len) do { \ 
    (addr)->addr_type = type; \ 
    (addr)->addr_bits = bits; \ 
    memmove((addr)->addr_data8, (char *)data, len); \ 
} while (0) 

C是否需要執行宏中的代碼?

回答

1

這是c預處理程序的定義宏。最後那些反斜槓是因爲它的所有定義跨越了多行。一個do while循環就像一個while循環,除了在最後完成的評估之外,它允許它至少執行一次。在這種情況下,開發人員使用while循環作爲一種破解方式,允許將其代碼放入自己的範圍。

從在同一個目錄eth.h:

typedef struct eth_addr { 
     uint8_t   data[ETH_ADDR_LEN]; 
} eth_addr_t; 

ip.h:

typedef uint32_t  ip_addr_t; 

ip6.h:

typedef struct ip6_addr { 
     uint8_t   data[IP6_ADDR_LEN]; 
} ip6_addr_t; 

蜜罐-1.1.1 /未使用/ WinSock.h:

/* 
* Structure used by kernel to store most 
* addresses. 
*/ 
struct sockaddr { 
     u_short sa_family;    /* address family */ 
     char sa_data[14];   /* up to 14 bytes of direct address */ 
}; 
+0

謝謝,昨天花了很多時間使用grep和Google,只是不知道我在找什麼。另外我認爲我正在尋找的sockaddr來自sys/socket.h – 2009-05-23 20:08:14

0

你看過htod嗎?它應該自動將.h文件轉換爲d聲明。

相關問題