2

構造体でユニオンを初期化する問題に関してstackoverflowを閲覧してきましたが、うまくいきませんでした。

これが私の構造です

typedef struct dc_netif_filter {
    unsigned char filter_type;  
    union {
        uint32_t itf_nb;
        char * buf; 
    } value;
} dc_netif_filter_t;  

私のコードでは、私は使用しようとしました:

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,{{0, "tun"}}};  

これによりエラーが発生します:タイプ'uint32_t'のスカラー初期化子を中括弧で囲みます</p>

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,{0, "tun"}};  

これによりエラーが発生します:'dc_netif_filter :: <anonymous union>'</p>の初期化子が多すぎます

そのようなdc_netif_filter_tを宣言するにはどうすればよいですか?

私はubuntuでg++を使用しています。dc_netif_filter_tは、サードパーティのプロジェクトからのものであるため、変更できる構造体ではないことに注意してください。

**編集:説明したように、初期化できるのは1つのフィールドのみです。問題は

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,"tun0"}; 

変換エラーが発生します:'constchar*'から'uint32_tへの無効な変換

ありがとう

4

3 に答える 3

6
于 2012-04-16T13:24:12.850 に答える
2

bufメンバーが使用されること、およびその値が であることを示すために、構造を初期化しようとしているようbufです"tun"。C++11 より前の C++ には指定された初期化子がないため、初期化子を使用してそれを行うことはできません。初期化できるのはの最初のフィールドのみであるunionため、コードで割り当てを行う必要があります。

static get_dc_netif_filter_t() {
    static c_netif_filter_t netif = {DC_NETIF_SELECT_NAME, {0}};
    if (netif.value.itf_nb == 0) {
        netif.value.buf = "tun";
    }
    return netif;
}

C++11 では、次のようにできます。

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { .buf = "tun"}};
于 2012-04-16T13:34:40.537 に答える
1

これは g++ 4.7.0 で動作します:

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, {.buf="tun"}};

指定された初期化子は C のみであると想定されていますが、C++ ではありません! 多分それはGNU拡張ですか?

最良の(最も互換性のある)方法は、初期化後にメンバーを割り当てることだと思います:

dc_netif_filter_t netif;
netif.itf_nb = DC_NETIF_SELECT_NAME;
netif.value.buf = "TUN";
于 2012-04-16T13:34:24.420 に答える