在两个等效的C结构之间投射

时间:2013-11-23 19:28:05

标签: c casting struct

编译以下代码时:

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实例之间进行转换?

4 个答案:

答案 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;