编译c代码:错误:赋值的左操作数需要左值

编译c代码:错误:赋值的左操作数需要左值,c,C,当我试图在gcc 4.4.5上编译一些代码时,gcc在这一行遇到错误: ORG(e) = DEST(a); 这两个宏定义为: #define ORG(e) ((site_struct *) ODATA(e)) #define DEST(e) ((site_struct *) DDATA(e)) #define ODATA(e) ((edge_struct *)((e)&0xfffffffcu))->data[(e)&3] #define DDATA(e) ((edge_

当我试图在gcc 4.4.5上编译一些代码时,gcc在这一行遇到错误:

ORG(e) = DEST(a);
这两个宏定义为:

#define ORG(e) ((site_struct *) ODATA(e))
#define DEST(e) ((site_struct *) DDATA(e))
#define ODATA(e) ((edge_struct *)((e)&0xfffffffcu))->data[(e)&3]
#define DDATA(e) ((edge_struct *)((e)&0xfffffffcu))->data[((e)+2)&3]
我在solaris上用gcc 3.4.5编译这篇文章时没有遇到问题

我一直在试图弄明白为什么它在很长一段时间内无法编译,但没有用。谁能给我指出正确的方向吗


在评论中:

ODATA和DDATA的定义如下:

#define ORG(e) ((site_struct *) ODATA(e))
#define DEST(e) ((site_struct *) DDATA(e))
#define ODATA(e) ((edge_struct *)((e)&0xfffffffcu))->data[(e)&3]
#define DDATA(e) ((edge_struct *)((e)&0xfffffffcu))->data[((e)+2)&3]

我很难相信你能在Solaris上编译它。作业的左侧是演员阵容的结果。C语言中的强制转换结果总是右值。不能将任何内容分配给右值。简单是没有意义的。右值不是对象。它们不存储在内存中,这就是为什么尝试将任何内容分配给右值都没有意义。这是C语言的一个非常基本的事实,这就是为什么我不相信你能用任何C编译器编译它

例如,此代码

int i;
(int) i = 5; /* ERROR */
不编译的原因与代码不编译的原因完全相同


很难“为你指明正确的方向”,因为完全不清楚你想做什么。那个作业是什么意思?为什么你想在作业的两边都进行强制转换?

我很难相信你能在Solaris上编译它。作业的左侧是演员阵容的结果。C语言中的强制转换结果总是右值。不能将任何内容分配给右值。简单是没有意义的。右值不是对象。它们不存储在内存中,这就是为什么尝试将任何内容分配给右值都没有意义。这是C语言的一个非常基本的事实,这就是为什么我不相信你能用任何C编译器编译它

例如,此代码

int i;
(int) i = 5; /* ERROR */
不编译的原因与代码不编译的原因完全相同


很难“为你指明正确的方向”,因为完全不清楚你想做什么。那个作业是什么意思?为什么要在赋值的两边都进行强制转换?

强制转换的结果是右值,而不是左值。照此,结果只是“原始”值,而不是作为值源的原始对象

在您的案例中,如何解决问题并不完全清楚。特别是,如果不知道ODATA(e)和DDATA(e)是/做什么,很难猜测如何从那里开始

如果试图将一个结构分配给另一个结构,可以执行以下操作:

*(site_struct *)a = *(site_struct *)b;
请注意,尽管在赋值的两侧都有强制转换,但我们并没有试图将其赋值给强制转换的结果——相反,我们将强制转换一个指向正确类型的指针,然后取消对该指针的引用,并将其赋值给指针所指的对象

编辑:好的,在宏展开后,我们会得到如下结果:

((site_struct *)((edge_struct *)((e)&0xfffffffcu))->data[(e)&3]) =
((site_struct *)((edge_struct *)((a)&0xfffffffcu))->data[((a)+2)&3]);
基于这一点,我想我会尝试至少支持两个抽象层次,并试图找出所有这些的意图。这与纯写编码非常接近。虽然您已经按照要求提供了ODATA和DDATA的定义,但要想弄清楚这一点似乎需要更多的时间——您需要仔细查看
edge\u struct
的定义,可能还需要查看
site\u struct
的定义。您几乎必须弄清
edge\u结构
数据
成员中下标的含义


长话短说,这看起来像是一个相当严重的逆向工程案例,几乎不可能预测需要检查和理解多少代码才能重写/更新它,从而从现代编译器获得正确的结果。

强制转换的结果是右值,而不是左值。照此,结果只是“原始”值,而不是作为值源的原始对象

在您的案例中,如何解决问题并不完全清楚。特别是,如果不知道ODATA(e)和DDATA(e)是/做什么,很难猜测如何从那里开始

如果试图将一个结构分配给另一个结构,可以执行以下操作:

*(site_struct *)a = *(site_struct *)b;
请注意,尽管在赋值的两侧都有强制转换,但我们并没有试图将其赋值给强制转换的结果——相反,我们将强制转换一个指向正确类型的指针,然后取消对该指针的引用,并将其赋值给指针所指的对象

编辑:好的,在宏展开后,我们会得到如下结果:

((site_struct *)((edge_struct *)((e)&0xfffffffcu))->data[(e)&3]) =
((site_struct *)((edge_struct *)((a)&0xfffffffcu))->data[((a)+2)&3]);
基于这一点,我想我会尝试至少支持两个抽象层次,并试图找出所有这些的意图。这与纯写编码非常接近。虽然您已经按照要求提供了ODATA和DDATA的定义,但要想弄清楚这一点似乎需要更多的时间——您需要仔细查看
edge\u struct
的定义,可能还需要查看
site\u struct
的定义。您几乎必须弄清
edge\u结构
数据
成员中下标的含义

长话短说,这看起来像是一个相当严重的逆向工程案例,几乎不可能预测需要检查和理解多少代码,然后才能重写/更新它,从而从现代编译器获得正确的结果。

您的
ODATA()
DDATA()
宏计算为左值(这些宏中的强制转换是指向一个指针,该指针被解引用以获得左值)。因此,需要弄清楚的是原始的
ORG()
DEST()宏是做什么的:

#define ORG(e) ((site_struct *) ODATA(e))
#define DEST(e) ((site_struct *) DDATA(e))
基本上,它们将
ODATA()
DDATA()
宏生成的左值作为指针处理。GCC 3.4.5的强制转换为左值语言扩展,在3.4.5中被弃用,在4.0中被删除,如果强制转换的操作数为