如何让 gcc/g++ 接受像 LOBYTE(v15) = someExpression 这样的表达式

How to make gcc/g++ accept expressions like LOBYTE(v15) = someExpression?

本文关键字:v15 someExpression 表达式 LOBYTE gcc g++      更新时间:2023-10-16

我有一个反编译函数,想要编译它的源代码。问题出在 LOBYTE 语句上:在每一行上获取"错误:左值需要作为赋值的左操作数",如下所示:

LOBYTE(v9) = ((_BYTE)v12 + (v7 ^ v13)) & 0x1F;

请提示解决方法。

假设v9是算术类型的对象(该问题没有明确声明所涉及的不同标识符/宏),并且系统是小端序:

#define LOBYTE(x)  (*(unsigned char *) &(x))

将允许LOBYTE=运算符的左侧。

我不认为LOBYTE是某个变量,你可以在其中获得一些价值。它是一个返回值本身的MACRO。实际上,您正在编写一些类似于[预处理后]

的东西

5 = 2 * 3

这是不可能的。您将需要在赋值=操作员的 LHS 上有一些可写内存。

在您的情况下,LOBYTE的可能实现是 #define LOBYTE(x) ((unsigned char) ((x) & 0xff)) ,这不是一个lvalue。这就是错误存在的原因。


编辑:

关于"如何解决"部分[抱歉在第一个答案中丢失],您需要提供左值作为LOBYTE的结果。

只是为了补充一下ouah的答案,你可以做一些类似的事情

#define LOBYTE(x)  (*(uint8_t *) &(x))

以产生所需的左值。