在下面的代码中,当我将float指针强制转换为struct时,我得到一个错误,但是如果我将其转换为其他东西,编译器就不会抱怨。为什么要这样做?
typedef unsigned byte CELbool;
typedef struct {(...)} Color;
typedef struct {
(...)
Color color;
CELbool b;
} Light;
Light _light;
void function(float *x) {
_light.b = (CELbool)*x; // No error
_light.color = (Color)*x; // (!) Used type 'Color' where arithmetic or pointer type is required
}
编辑:所以说我有* x是指向Color的指针,那么获取该Color的正确方法是什么?我目前正在使用Color c = *((Color *)(value))
,但我认为这不是正确的方法。
答案 0 :(得分:7)
您正在进行的转换不是从指针转换为整数或结构,而是从浮点数转换为整数和结构。表达式
(CELbool)*x
将*x
(由x
为float*
,float
)的值转换为CELBool
,您已定义作为某种整数类型的typedef。这种转换是可以的,因为C允许在浮点值和整数值之间进行转换,因为有一种合理的转换方式。但是,第二个演员是
(Color)*x
Color
是一个结构,C不定义浮点类型和struct
之间的转换,就像它没有定义整数类型和struct
之间的转换一样,因为一般来说没有合理的方法来进行这种转换。
关于“需要指针或算术类型”的错误的原因是因为float
的强制转换需要转换为float
可以转换为的某种类型,这可能是一些实值类型,整数类型或指针类型,因为float
可以转换为指针(虽然这样做是一个非常糟糕的主意!)类型Color
不是预期的通过编译器列出的合理的事情列表,因此错误。
希望这有帮助!