我有大约16k行1998年的C代码(约50个主程序),当时可以在gcc下完美构建,但现在在第一个例程“stutter.c”中出现了许多“需要左值作为赋值操作数”的错误。我不是足够熟练的C程序员,找不到问题,并且似乎无法搜索到与我的问题相关的答案(具有这种相当通用的错误消息)。
以下是具体信息:
(年代久远的)Makefile中的编译行:
gcc -O3 -Wall -D__dest_os=unix -I/usr/X11/include -DPLOTX11 -c -o stutter.o ../src/stutter.c
失败语句示例:
"
如果需要更多的代码细节,请告诉我。这里是否有一些明显的过时特性可以解释这个错误??
我作为一名科学Fortran程序员有多年的经验,但在退休之前没有学到足够的C语言知识来完全转换。在http://gcc.gnu.org/bugs/上没有找到任何关于遗留代码的有用信息。我很感激任何能帮助我在Linux下为我的当前项目使这些例程工作的帮助。非常感谢!
以下是具体信息:
(年代久远的)Makefile中的编译行:
gcc -O3 -Wall -D__dest_os=unix -I/usr/X11/include -DPLOTX11 -c -o stutter.o ../src/stutter.c
失败语句示例:
cell_car(cell) = free_list;
cell_type(cell) = type;
cell_name(atom) = strdup(name);
cell_cdr(list) = binding_list;
cell_cdr(cell_car(current)) = b;
"
...(以及许多类似的)
前面是:
" typedef enum CELL_ENUM {
CELL_LAMBDA, CELL_SFUNC, CELL_VFUNC, CELL_LIST, CELL_ATOM
} CELL_TYPE;
typedef struct CELL_STRUCT {
void *car, *cdr;
unsigned type : 7;
unsigned mark : 1;
char empty[3];
} CELL;
并且:
#define cell_car(c) ((CELL *)(c)->car)
#define cell_cdr(c) ((CELL *)(c)->cdr)
#define cell_name(c) ((char *)(c)->car)
#define cell_func(c) ((CELL *(*)())(c)->car)
#define cell_type(c) ((CELL_TYPE)(c)->type)
#define cell_mark(c) ((c)->mark)
如果需要更多的代码细节,请告诉我。这里是否有一些明显的过时特性可以解释这个错误??
我作为一名科学Fortran程序员有多年的经验,但在退休之前没有学到足够的C语言知识来完全转换。在http://gcc.gnu.org/bugs/上没有找到任何关于遗留代码的有用信息。我很感激任何能帮助我在Linux下为我的当前项目使这些例程工作的帮助。非常感谢!
free_list
的类型,很难说... @sambledsoe,你可以尝试使用clang编译而不是gcc,以便获取更多有用的错误信息吗? - Maxime Chéramy(some_variable) = 123
是合法的吗?因为这就是你在这里做的事情。 - Eric Lippertfree_list
的类型是什么,该宏都不能出现在赋值语句的左侧。 - dypcar
(地址寄存器的内容)和cdr
(数据寄存器的内容)。嗯 - 我闻到了Lisp的味道。 - chux - Reinstate Monica