我已经在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;
1条答案
按热度按时间sczxawaw1#
强制转换的结果不是l值;你不能分配给它。所以,
(int8)
强制转换意味着你不能赋值给它。为什么你认为演员阵容是远程必要的?现在您已经显示了结构(不是minimal!),aps_parameter
已经是一个int8
了,所以强制转换是完全多余的-而且是错误的!用途:不要将分号用作宏中的最后一个字符;它会导致混乱。但这与你的问题没有直接关系。如果你不去掉分号,你在写的时候会被错误弄糊涂:
如果你没有立即明白为什么结尾的分号是不好的,请参阅Why use apparently meaningless
do
-while
andif
-else
statements in macros?。你可以声称“我总是在每个if
,else
或循环语句的主体周围使用大括号-这将消除bug,但它不会改变尾随分号是bug的事实。