2012-04-16 19 views
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' と

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

これはエラーを出します: 'dc_netif_filter :: <匿名ユニオン'のイニシャライザが多すぎます '

このようなdc_netif_filter_tをどのように宣言しますか?

私はubuntuでg ++を使用しています。 dc_netif_filter_tは、サードパーティーのプロジェクトのように変更できる構造体ではありません。

**編集:私が説明したように、私は1つのフィールドのみを初期化できます。コンパイラが言うようにtoo many initializers for ‘dc_netif_filter::< anonymous union>’、のuint32_t「から「のconstのchar *」から無効な変換

おかげ

+3

ユニオンのメンバーを1つだけ初期化します。 – Nick

+0

*すべての*ユニオンのメンバーを初期化したくありません。 how about: 'dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME、" tun "};' – trojanfoe

+0

これでbufを "tun"に設定してから、itf_nbに0を設定するにはどうすればいいですか? – djfoxmccloud

答えて

6

:問題は

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,"tun0"}; 

とのことである私は、変換エラーが発生します。

フィールドを1つだけ初期化し、両方を初期化しないでください。

それを正しく初期化するために、フィールドの名前を使用します。

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { buf: "tun0" }}; 
+1

フィールドのみを初期化すると、私の編集内容(OPが編集されているのを見てください)に興味があります。変換エラーが発生しました – djfoxmccloud

+0

私の編集した答えを見てください。 –

+1

これは非標準のg ++​​拡張機能だと思います。 – Nick

1

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

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

指定された初期化子がはCだけでなく、ことになっているが、 C++!たぶんそれはGNUの拡張ですか?

私が一番(最も互換性のある)方法は、初期化後にメンバーを割り当てることです推測:あなたはbufメンバーが使用されることを示すために、あなたの構造体を初期化しようとしているように見えます

dc_netif_filter_t netif; 
netif.itf_nb = DC_NETIF_SELECT_NAME; 
netif.value.buf = "TUN"; 
+0

私は: '。'トークンの前に期待されるprimary-expressionを得る 私は行方不明のコンパイラオプションがありますか? – djfoxmccloud

+0

いいえ、コマンドラインオプションは使用しませんでした。私はそれがコンパイラのバージョンに依存している必要がありますね。とにかく私はそれがC++で動作するはずではないと言っています。 – trojanfoe

+0

私はそれが「C++で動作するはずです」ということは理解していますが、このコードを「そのまま」コンパイルする必要があります;)g ++ 4.4.3では動作しません。アップグレードしようとします – djfoxmccloud

2

、およびそのbufの値は"tun"である必要があります。 C++はC++ 11が指定された初期化子を欠い前にいるので、あなたは初期化子でそれを行うことはできません。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"}}; 
+0

私は: '。'トークンの前に期待されるprimary-expressionを得る 私は行方不明のコンパイラオプションがありますか? – djfoxmccloud

+0

@djfoxmccloud try '-std = C++ 11' – dasblinkenlight

+0

これは間違っています。指定された初期化子はC++ 11にはありません。これらは現在、C++ 20(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdfを参照)で提案されています。しかし、現在GCC、Clang、MSVCで動作しているようです。 – minexew

関連する問題