2012-04-09 10 views
2

ユニオンに関する疑問があります。ランタイム時にcのユニオンメンバーを区別する方法

として定義されているとします。
union emp{ 
    float f; 
    int i; 
}; 

どのユニオンフィールドが使用されているかを判断する方法はありますか?私はused.The機能が事前に

void print(union u){ 

    // if float field is initialized 
    printf("float field = %f\n",u.f); 

    // if int field is initialized 
    printf("int field = %d\n",u.i); 


} 

おかげのようであり、私はint型のフィールドがある場合はfloatフィールドを使用して印刷されている場合int型フロートを印刷する必要がいる状況に遭遇しています。

答えて

6

unionとは分かりません。通常は、何らかのタグ値を含むstructにラップします。

struct val { 
    enum { EMP_INT, EMP_FLOAT } tag; 
    union emp { 
    int i; 
    float f; 
    } emp; 
}; 
1

はそうでもない、その場に応じて、あなたはメモリがfloatまたはintどちらかと解釈されますアクセス。

構造体の共用体を作成し、どのフィールドが使用されているかを示すフラグを保持することをお勧めします。

1

実行できない情報は、実行時にはどこにも保存されません。手動タイプを格納する

struct emp { 
     enum storedValue type; 
     union { 
       float f; 
       int i; 
     } 
}; 

あなたのような何かを行うことができます。列挙型はfloatvalintvalなどの値を持ちます。

列挙型ではなく、isFloatのようなブール値を使用できます。

関連する問題