Sta*_*aro 4 c struct pointers casting
在下面的代码中,当我将float指针强制转换为结构体时,我得到一个错误,但是如果我将其转换为其他东西,则编译器不会抱怨.它为什么这样做?
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
}
Run Code Online (Sandbox Code Playgroud)
编辑:所以说我有*x是指向颜色的指针,那么获得该颜色的正确方法是什么?我目前正在使用Color c = *((Color *)(value)),但我不认为这是正确的方法.
您正在进行的转换不是从指针转换为整数或结构,而是从浮点数转换为整数和结构.表达方式
(CELbool)*x
Run Code Online (Sandbox Code Playgroud)
将*x(的,因为x是a float*,是a float)的值转换为a CELBool,您已将其定义为某个整数类型的typedef.这种转换是可以的,因为C允许在浮点值和整数值之间进行转换,因为有一种合理的转换方式.然而,第二个演员是
(Color)*x
Run Code Online (Sandbox Code Playgroud)
Color是一个结构,C不定义浮点类型和structs 之间的转换,就像它没有定义整数类型和structs 之间的转换一样,因为通常没有合理的方法来进行这种转换.
关于"需要指针或算术类型"的错误的原因是因为float需要转换为某些float可转换为s的类型,这可能是某些实值类型,整数类型或指针类型,因为floats可以转换为指针(虽然这样做是一个非常糟糕的主意!)Color编译器的合理内容列表不希望这种类型,因此错误.
希望这可以帮助!