我有~16k行1998年的老式C代码(约50个主要编程),当时在gcc下完美构建但现在在第一个例程"stutter.c"中失败了许多"左值操作数需要左值"错误.我不足以找到问题的C程序员,并且似乎无法在因特网上搜索特定于我的问题的答案(使用这个相当通用的错误消息).
以下是具体内容:
从(vintage)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;
Run Code Online (Sandbox Code Playgroud)
...(和很多类似的)
之前是:
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;
Run Code Online (Sandbox Code Playgroud)
和:
#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)
Run Code Online (Sandbox Code Playgroud)
如果需要,可提供更多代码详情.这里有一些明显的弃用功能可以解释这个错误吗?
作为一名科学的Fortran程序员,我有多年的经验,但在学习足够的C语言以完全转换之前已退休.在http://gcc.gnu.org/bugs/上找不到有关遗留代码的任何帮助.我感谢任何能帮我完成C,C++和gcc教育的帮助,然后才能在linux下为我当前的项目工作.非常感谢!
pat*_*pat 11
gcc不再允许您分配演员表.
即
((CELL *)(cell)->car) = free_list;
Run Code Online (Sandbox Code Playgroud)
不再合法.它不是投射lhs来匹配rhs,而是倾向于投射rhs以匹配lhs.解决这个问题的一种方法是获取左值的地址,将其转换为指针,然后取消引用该指针,因此赋值是指针取消引用而不是转换.
即
*((CELL **)&(cell)->car) = free_list;
Run Code Online (Sandbox Code Playgroud)
这可以通过更新宏来处理,所以它应该是非常轻松的...
即
#define cell_car(c) (*((CELL **)&(c)->car))
Run Code Online (Sandbox Code Playgroud)
等等...
然后,该宏可以用作左值或右值.