1

D プログラミング言語用のlibdnetのラッパーを作成しようとしています。私が遭遇した問題は、 addr.h の変換中に eth_addr_t、ip_addr_t、および ip6_addr_t の下線の型がわからないことです。最後の謎の型は sockaddr です

また、常に false になる 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 プリプロセッサの定義マクロです。最後のバックスラッシュは、複数の行にまたがるすべての 1 つの定義であるためです。do while ループは while ループに似ていますが、評価が最後に行われ、少なくとも 1 回は常に実行できる点が異なります。この場合、開発者はその 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;

Honeyd-1.1.1/unused/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 に答える