typedef struct list_head {
list_head *next; // Рекурсивная ссылка на тип list_head
list_head *prev // не нравится gcc 4.1.1
} list_head
Интересная особенность gcc 4.1.1
Я тут наткнулся на интересную особенность компилятора gcc 4.1.1. Он отказывается принимать нижеследующий код: требует квалификатор перед list_head. Прошу подсказку: какой ключик следует указать, чтобы это преодолеть?
Спасибо!
Код:
P.S.
Если компилировать командой: g++ -o worklist worklist.c, то всё получается без проблем. И ещё gcc 2.7 под Windows тоже берёт этот код без проблем.
Цитата: assign
Здравствуйте!
Я тут наткнулся на интересную особенность компилятора gcc 4.1.1. Он отказывается принимать нижеследующий код: требует квалификатор перед list_head. Прошу подсказку: какой ключик следует указать, чтобы это преодолеть?
Спасибо!
P.S.
Если компилировать командой: g++ -o worklist worklist.c, то всё получается без проблем. И ещё gcc 2.7 под Windows тоже берёт этот код без проблем.
Я тут наткнулся на интересную особенность компилятора gcc 4.1.1. Он отказывается принимать нижеследующий код: требует квалификатор перед list_head. Прошу подсказку: какой ключик следует указать, чтобы это преодолеть?
Спасибо!
Код:
typedef struct list_head {
list_head *next; // Рекурсивная ссылка на тип list_head
list_head *prev // не нравится gcc 4.1.1
} list_head
list_head *next; // Рекурсивная ссылка на тип list_head
list_head *prev // не нравится gcc 4.1.1
} list_head
P.S.
Если компилировать командой: g++ -o worklist worklist.c, то всё получается без проблем. И ещё gcc 2.7 под Windows тоже берёт этот код без проблем.
Пишу так:
Код:
typedef struct list_head {
struct list_head *next;
struct list_head *prev;
} list_head;
struct list_head *next;
struct list_head *prev;
} list_head;
проблем при компиляции не вижу. дальше не смотрел.
Цитата: Lerkin
Пишу так:
Код:
typedef struct list_head {
struct list_head *next;
struct list_head *prev;
} list_head;
struct list_head *next;
struct list_head *prev;
} list_head;
Завершающая точка с запятой у меня в коде присутствует, это только здесь в посте я её забыл. Проблема заключается в том, чтобы заставить gcc компилировать структуру, содержащую ссылку на самоё себя, как это, например, делается в том же Паскале:
Код:
type
PListHead = ^ListHead;
ListHead = record
next: PListHead;
prev: PListHead;
end;
PListHead = ^ListHead;
ListHead = record
next: PListHead;
prev: PListHead;
end;
Цитата: assign
Завершающая точка с запятой у меня в коде присутствует, это только здесь в посте я её забыл. Проблема заключается в том, чтобы заставить gcc компилировать структуру, содержащую ссылку на самоё себя...
Я же специально выделил ключевые слова. Сравните структуры.
Прошу прощения за тупость... Теперь я всё понял... Спасибо!
В С++ это не обязательно. g++, не смотря, на то что расширение у файла .c, вызывает gcc как c++ компилятор и линкует стандартную плюсовую либу. Соответственно там все нормально. )
Код:
typedef struct {
list_head *next
list_head *prev
} list_head
list_head *next
list_head *prev
} list_head
без квалификатора struct.
Цитата: assign
Кстати я сейчас ещё выяснил, что MSVC++ 6.0 тоже принимает вариант:
без квалификатора struct.
Код:
typedef struct {
list_head *next
list_head *prev
} list_head
list_head *next
list_head *prev
} list_head
без квалификатора struct.
Ну, дык. Он же изначально в С++ компилит. Создай файл test.c с этой структурой и откомпилируй из консоли: [FONT="Courier New"][SIZE="2"]cl test.c[/SIZE][/FONT]
Потом переименуй файл в test.cpp и аналогично из консоли: [FONT="Courier New"][SIZE="2"]cl test.cpp[/SIZE][/FONT]
Цитата: Lerkin
Ну, дык. Он же изначально в С++ компилит. Создай файл test.c с этой структурой и откомпилируй из консоли: [FONT="Courier New"][SIZE="2"]cl test.c[/SIZE][/FONT]
Потом переименуй файл в test.cpp и аналогично из консоли: [FONT="Courier New"][SIZE="2"]cl test.cpp[/SIZE][/FONT]
Потом переименуй файл в test.cpp и аналогично из консоли: [FONT="Courier New"][SIZE="2"]cl test.cpp[/SIZE][/FONT]
Достаточно даже в настроке проекта или даже этого файла указать - компилировать как C.
Цитата: Lerkin
Ну, дык. Он же изначально в С++ компилит. Создай файл test.c с этой структурой и откомпилируй из консоли: [FONT="Courier New"][SIZE="2"]cl test.c[/SIZE][/FONT]
Потом переименуй файл в test.cpp и аналогично из консоли: [FONT="Courier New"][SIZE="2"]cl test.cpp[/SIZE][/FONT]
Да,Llerkin совершенно прав. Всё так и есть.