3

Intel DPDKのコード例で、この奇妙な構文構造を見つけました。誰かが私にそれが何を意味するのか説明できますか?

static const struct rte_eth_conf port_conf = {
    .rxmode = {
        .split_hdr_size = 0,
        .header_split   = 0,
        .hw_ip_checksum = 0,
        .hw_vlan_filter = 0,
        .jumbo_frame    = 0,
        .hw_strip_crc   = 0,
    },
    .txmode = {
    }
};
4

3 に答える 3

6

これは、指定された初期化子として知られるC99構文です。

以前のC標準では、構造体初期化子の要素は、構造体定義と同じ順序で表示される必要がありました。指定された初期化子を使用すると、その制限が解除されます。当然、構造体メンバーは、どのメンバーが初期化されているかを示すために名前を付ける必要があります。

指定された初期化子は配列で使用することもでき、配列の特定の要素を初期化できます。例えば:

int a[6] = { [4] = 29, [2] = 15 };
于 2012-05-23T13:21:25.687 に答える
2

あなたが持っている場合

struct X
{
    type_a var_a;
    type_b var_b;
    type_c var_c;
    type_d var_d;
};

次のようにオブジェクトを初期化できます。

struct X x = {value_a, value_b, value_c, value_d};

Xただし、これは、変数の順序と、すべての変数の初期値を知る必要があることを意味します。または、次のように初期化できます。

struct X x = {
    .var_a = value_a,
    .var_b = value_b,
    .var_c = value_c,
    .var_d = value_d
};

このようにして、メンバー変数を任意の順序で初期化することも、一部をスキップすることもできます。

これは、ユーザーが初期化する必要のある変数がいくつかあるライブラリで特に役立ちますが、他の変数はより内部的であり、ライブラリのさまざまなバージョンで変更することもできます。この種の初期化を使用すると、ユーザーはこれらの余分な変数について知る必要がありません。

于 2012-05-23T13:22:49.873 に答える
2

これは、指定された初期化子と呼ばれるC99機能です。対応するフィールドが宣言に表示される順序で値を指定するのではなく、値を設定するフィールドの名前を指定できます。さらに、この構文を使用すると、最初のメンバー以外のユニオンのメンバーを初期化できます。これは、C99以前では不可能でした。

于 2012-05-23T13:21:19.233 に答える