C语言 错误:左值需要作为宏中赋值的左操作数

o7jaxewo  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(134)

我已经在fedora上下载了开源gt包的源代码,并试图在Debian上编译它。在编译过程中,instrum.c中的这段代码在标题中出现以下错误:

#define READ_CHAR(thing) \
      thing = tmp[tmpindex++];

完整的错误报告如下:

instrum.c: In function ‘load_instrument’:
instrum.c:944:13: error: lvalue required as left operand of assignment
  944 |       thing = tmp[tmpindex++];
      |             ^
instrum.c:1173:7: note: in expansion of macro ‘READ_CHAR’
 1173 |       READ_CHAR ((int8)sp->aps_parameter);
      |       ^~~~~~~~~
make[1]: *** [Makefile:335: instrum.o] Error 1
make[1]: Leaving directory '/home/classic/gt-0.4/src'
make: *** [Makefile:235: all] Error 2

sp定义的结构如下:

typedef struct {
  splen_t
    loop_start, loop_end, data_length;
  ...
  ...
  int32
    freq_scale, vibrato_delay;
  int8
    aps_parameter, sw_up, sw_down, sw_lokey, sw_hikey, sw_last;
} Sample;
sczxawaw

sczxawaw1#

强制转换的结果不是l值;你不能分配给它。所以,(int8)强制转换意味着你不能赋值给它。为什么你认为演员阵容是远程必要的?现在您已经显示了结构(不是minimal!),aps_parameter已经是一个int8了,所以强制转换是完全多余的-而且是错误的!用途:

READ_CHAR(sp->aps_parameter);

不要将分号用作宏中的最后一个字符;它会导致混乱。但这与你的问题没有直接关系。如果你不去掉分号,你在写的时候会被错误弄糊涂:

if (x == y)
    READ_CHAR(sp->aps_parameter);
else
    puts("Busted!");

如果你没有立即明白为什么结尾的分号是不好的,请参阅Why use apparently meaningless do - while and if - else statements in macros?。你可以声称“我总是在每个ifelse或循环语句的主体周围使用大括号-这将消除bug,但它不会改变尾随分号是bug的事实。

相关问题