1998年的老式C代码现在无法在gcc下编译

sam*_*soe 4 c gcc legacy-code

我有~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)

等等...

然后,该宏可以用作左值或右值.

  • 在GCC 4.0(2005)中删除了"cast-as-lvalue"C语言扩展(在3.3.4中弃用):http://gcc.gnu.org/gcc-4.0/changes.html (3认同)