在我无法控制的标题中,有以下内容:
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)))
};
但是你不能在struct initialisers中使用变量。我还能做什么?
答案 0 :(得分:2)
怎么样
variable my_variables[2] = {
VARIABLE_DEF("Variable 1", ((value_t){.v_float = 1.1f}.v_int)),
VARIABLE_DEF("Variable 2", ((value_t){.v_float = 2.2f}.v_int)),
};
(未测试的)
第二个想法,如何定义一个更灵活的VARIABLE_DEF
替代品并在需要时使用它?
像
这样的东西#define VARIABLE_DEF_ALT(Name, Value) {Name, {Value}}
#define VARIABLE_DEF_ALT2(Name, Field, Value) {Name, {.Field = Value}}
variable my_variables[2] = {
VARIABLE_DEF_ALT("Variable 1", .v_float = 1.1f),
VARIABLE_DEF_ALT2("Variable 2", v_float, 2.2f),
};
应该有用。
或者只是跳过宏:
variable my_variables[2] = {
{"Variable 1", {.v_float = 1.1f}},
{"Variable 2", {.v_float = 2.2f}},
};
- 实际上是宏,还是你为这次讨论简化了一个更复杂的案例?
答案 1 :(得分:0)
也许像static int f(float x) { return *(int*)&x; }
这样的函数可以吗?
答案 2 :(得分:0)
您不能在代码中使用Michael Kerlin的答案中的函数,因为函数调用不能用于初始值设定项。
但您可以编写一个执行此类转换的程序,然后将生成的整数值复制/粘贴到您的程序中! (有一个很好的评论,说明它的真正价值)。
答案 3 :(得分:0)
使用命名的初始值设定项:
variable my_variables[2] = {
VARIABLE_DEF("Variable 1", 1),
{ .name = "Variable 2", .value.v_float = 1.1f }
};