编译以下代码时:
struct Point {
int x;
int y;
};
struct Position {
int x;
int y;
};
struct Point p = {1, 2};
struct Position q = (struct Position)p;
发生错误:
错误:使用类型'struct Position',其中算术或指针类型 需要
当那些struct
实际上具有相同的定义时,是否有某种方法可以在不同的struct
实例之间进行转换?
答案 0 :(得分:3)
C语言中的结构类型没有“强制转换”这样的东西。 C语言仅支持标量类型的转换和void
。
在()
内使用任何其他类型时,它不再是强制转换。它只能作为复合文字语法的一部分有效。复合文字是C语言的完全不同的特征,与任何演员表无关。例如,这是正确的
struct Position q = (struct Position) { 1, 2 };
在您的情况下,您显然需要重新连接序列
q = *(struct Position *) &p;
C语言声明这种访问被认为是有效的,只要您的结构声明确实是同步的。您也可以简单地将memcpy
- 一个对象考虑到另一个对象。
答案 1 :(得分:3)
你可以使用类型惩罚来做到这一点,因为只要只访问公共初始成员,标准就允许共享一个共同初始序列的两个结构别名:
struct Position q = *(struct Position *)&p;
甚至更好
union {
struct Position pos;
struct Point pt;
} pun;
pun.pt = p;
struct Position q = pun.pos;
答案 2 :(得分:1)
Casting one C structure into another
我认为这有答案。
同时检查
Is it possible to cast struct to another?
虽然你几乎可以投射任何东西,但是使用结构进行渲染很容易出错。
您可以使用指针进行类型转换;
Point_var = *((point *)& position_var);
答案 3 :(得分:0)
你不能直接进行类型转换,但你可以使用指针类型转换来实现这一点 -
struct Point *p;
p->x=1;
p->y=2;
struct Position *q = (Position *)p;