有没有办法在c中创建自定义类型转换?

时间:2014-07-11 08:23:44

标签: c casting

我有两种自定义类型:

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);

2 个答案:

答案 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魔法制作两个"观点"可用的相同比特,但这相当可怕,不太便携,不推荐。