のunsigned int型にリテラルfloatを変換するために、どのように、これがある:私のコントロール外のヘッダには同じビットパターン
typedef union {
char * v_charp;
int v_int;
float v_float;
} value_t;
typedef struct var {
char *name;
value_t value;
} variable;
#define VARIABLE_DEF(Name, Value) {Name, {(char*)Value}}
彼らは私のコードで、私はこのような何かをやることを期待:どうやらあなたは、浮動小数点リテラルで労働組合を初期化したい場合がありますことを考慮していない、これを書いた誰
variable my_variables[2] = {
VARIABLE_DEF("Variable 1", 1),
VARIABLE_DEF("Variable 2", 2)
};
。ですから、リテラルの浮動小数点を同じビットパターンの整数に変換する方法を理解する必要があります。
float tmp;
variable my_variables[2] = {
VARIABLE_DEF("Variable 1", tmp = 1.1f, *((unsigned int *)(&tmp))),
VARIABLE_DEF("Variable 2", tmp = 2.2f, *((unsigned int *)(&tmp)))
};
しかし、あなたは、構造体の初期化子内の変数を使用することはできません:私は中間変数を使用することができれば、それは簡単なことだろう。他に何ができますか?
私はこれの最初の部分を見て、「華麗な、もちろんです!しかし、コンパイラには他のアイデアがあります。実際のケースはより複雑です - 示されているように単一の列挙型、構造体、マクロ定義がありますが、それぞれのメンバーがもっとたくさんあります。マクロは本当に付加価値です。 – Tom
コンパイラの問題は、ユニオンの指定された初期化子がC99で導入された拡張であり、GCCのC++コードでサポートされていないことです。 C++になっていなければならないとき、私はこの質問Cに間違ったタグを付けたようです。 – Tom
この回答の最初のスニペットは、未定義の動作を呼び出します。私はそれを使用することをお勧めしません。 – jpalecek