我有两种自定义类型:
struct RGB {
int8_t R;
int8_t G;
int8_t B;
}
typedef int24_t color;
我有一个从RGB
转移到color
的功能:
color GetColor (RGB rgb) {
return (int24_t)rgb.R*256*256+(int24_t)rgb.G*256+(int24_t)rgb.B;
}
有没有办法定义一个新的类型转换,RGB
变量到color
类型的强制转换将自动使用我的函数?
这样我就可以使用:
RGB c1;
color c2;
...
c2=(color)c1; //c2=GetColor(c1);
答案 0 :(得分:2)
没有。没有。如果您不想调用该函数,可以将GetColor
转换为宏:
#define GET_COLOR(x) ((x).R*256*256 + (x).G*256 + (x).B)
RGB c1;
color c2;
c2 = GET_COLOR(c1);
这种特殊情况的另一种方法是将两个结构放在一个联合体中。
但是,这是否有效取决于您的编译器/机器,因为对齐,填充等。这可能不是可移植的,因此不鼓励。
你已被警告,例子来到这里:
struct RGB {
int8_t R;
int8_t G;
int8_t B;
}
typedef int24_t color;
typedef union _u_color {
RGB rgb;
color c24;
} u_color;
你可以做到
RGB c1 = {0x00, 0xFF, 0xAA};
u_color mycolor;
mycolor.rgb = c1;
c2 = mycolor.c24;
答案 1 :(得分:1)
不,那是神奇的。 C并没有比绝对必要的更多魔力。
如果你想用实际的,用户定义的工作,期望在C中使用函数调用。这通常被认为是语言的核心功能之一。
你可以做的就是使用可怕的union
魔法制作两个"观点"可用的相同比特,但这相当可怕,不太便携,不推荐。