2014-04-14 2 views
4

У меня есть ~ 16k строк кода V старинных C (~ 50 основных прогов), которые были построены безупречно под gcc в то время, но теперь терпят неудачу со многими «lvalue, требуемыми как левый операнд назначения «ошибки в первой процедуре,« stutter.c ». Мне не хватает программиста на C, чтобы найти проблему, и я не могу найти ответ в Интернете, специфичный для моей проблемы (с этим довольно общим сообщением об ошибке).1998 код урожая код теперь не скомпилирован под gcc

Вот специфика:

Вкомпилировать линия от (старинных) Makefile:

GCC -O3 -Wall -D__dest_os = Unix -I/USR/X11/включают -DPLOTX11 -c -o заикание .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/. Я был бы признателен за любую помощь, которая спасла бы меня от завершения моего обучения C, C++ и gcc, прежде чем я получу эти подпрограммы, работающие под Linux для моего текущего проекта. Большое спасибо!

+0

@ dyp, трудно сказать, не зная тип 'free_list' ... @sambledsoe, можете ли вы попытаться скомпилировать с clang вместо gcc, если вы получите более информативные сообщения об ошибках? –

+0

Было ли это в прошлом законным в C, чтобы сказать '(some_variable) = 123'? Потому что вот что ты здесь делаешь. –

+3

@ EricLippert все еще легально ... –

ответ

11

gcc больше не разрешает назначать роли. не

т.е.

((CELL *)(cell)->car) = free_list; 

больше не законно. Вместо того, чтобы лить lhs в соответствии с rhs, вам лучше было бы отдать rhs в соответствие с lhs. Один из способов этого - взять адрес lvalue, направить его как указатель и затем разыменовать этот указатель, поэтому назначение - разворот указателя, а не отбрасывание.

т.е.

*((CELL **)&(cell)->car) = free_list; 

Это могут быть обработаны путем обновления макросов, поэтому он должен быть довольно безболезненным ...

т.е.

#define cell_car(c)  (*((CELL **)&(c)->car)) 

и т.д ...

Этот макрос можно затем использовать как lvalue, так и rvalue.

+0

clang поднимет следующую ошибку: «ошибка: присвоение приложению запрещено, lvalue casts не поддерживается». –

+0

@Maxime, да, это сообщение об ошибке более информативно, чем gcc, «lvalue требуется как левый операнд назначения». – pat

+0

Я думаю, что это [это расширение] (http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC69) Документация с 2001 года (хотя и не найдена более старой). – dyp

1

В дополнение к изменению кода для ввода адреса, наведения указателя и разыменования, вероятно, также потребуется использовать параметр «no_strict_aliasing». C99 добавил некоторые правила с целью облегчения оптимизации, которые отрицают модель C состояния системы как связки unsigned char[]. Самым печально известным из них является правило строгого сложения.Хотя код, который бросает указатели как средство сказать «интерпретировать вещь, на которую указывает этот указатель как X», может компилироваться, запись в указатель с использованием одного типа, а чтение с использованием другого обычно дает Undefined Behavior, а некоторые компиляторы интерпретируют это как лицензию вести себя довольно странно и причудливо, не ограничиваясь законами времени и причинности.

Смежные вопросы