1

我正在尝试为 D 编程语言创建一个围绕libdnet的包装器。我遇到的问题是在转换addr.h时不知道 eth_addr_t、ip_addr_t 和 ip6_addr_t 的下划线类型是什么。最后一个神秘类型是 sockaddr

而且我也对为什么会有一个总是错误的 do 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是否需要执行宏中的代码?

4

2 回答 2

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;

Honeyd-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 */
};
于 2009-05-23T19:15:21.977 回答
0

你看过htod吗?它应该自动将 .h 文件转换为 d 声明。

于 2009-05-23T21:09:50.437 回答