У меня есть ~16k строк старого кода C 1998 года (~50 основных программ), которые в то время безупречно строились под gcc, но теперь терпят неудачу со многими ошибками «lvalue, требуемое как левый операнд присваивания» в первой подпрограмме, «stutter.c». Я недостаточно программист C, чтобы найти проблему, и я не могу найти ответ в Интернете, относящийся к моей проблеме (с этим довольно общим сообщением об ошибке).
Вот особенности:
Скомпилируйте строку из (винтажного) 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)
При необходимости доступны дополнительные сведения о коде. Есть ли здесь какая-то очевидная устаревшая функция, которая объясняет эту ошибку??
У меня многолетний опыт научного программирования на Фортране, но я ушел на пенсию, прежде чем достаточно изучил C, чтобы полностью переключиться. Не нашел ничего полезного об устаревшем коде на http://gcc.gnu.org/bugs/. . Я был бы признателен за любую помощь, которая избавила бы меня от необходимости завершать обучение C, C++ и gcc, прежде чем я получу эти подпрограммы, работающие под Linux для моего текущего проекта. Спасибо большое!
free_list
... @sambledsoe, можете ли вы попробовать скомпилировать с clang вместо gcc, если вы получите более информативные сообщения об ошибках? - person Maxime Chéramy   schedule 15.04.2014(some_variable) = 123
? Потому что это то, что ты здесь делаешь. - person Eric Lippert   schedule 15.04.2014free_list
, макрос не может находиться в левой части присваивания. - person dyp   schedule 15.04.2014car
(содержимое адресного регистра) иcdr
(содержимое регистра данных). Хм, я чую Lisp. - person chux - Reinstate Monica   schedule 15.04.2014