我正在尝试为D编程创建libdnet的包装器 语言。我遇到的问题是不知道是什么 为eth_addr_t,ip_addr_t和ip6_addr_t加下划线的类型 转换addr.h。最后一个神秘类型是sockaddr
我也很感兴趣为什么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是否需要在宏中执行代码?
答案 0 :(得分:1)
这是c预处理器的定义宏。最后的那些反斜杠是因为它是跨越多行的所有定义。 do while循环就像一个while循环,除了评估在最后完成,允许它总是至少执行一次。在这种情况下,开发人员使用while循环作为一种hack,以允许将代码放入自己的范围。
来自同一目录中的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 */
};
答案 1 :(得分:0)
你看过htod了吗?它应该自动将.h文件转换为d声明。