Структура должна иметь следующий вид
struct A
{
A* next;
};
И должна компилироваться на всех Си и Си++ компиляторах.
Смог придумать только 3 варианта как это сделать:
typedef struct A1 A1;
struct A1
{
A1* next;
};
struct A2
{
struct A2* next;
};
typedef struct _A3
{
struct _A3* next;
} A3;
void TestA1( A1* obj ) {}
void TestA2( struct A2* obj ) {}
void TestA3( A3* obj ) {}
Проблема второго варианта: нужно писать слово struct при использовании структуры.
Проблема третьего варианта: член структуры имеет тип который не используется (_A3) и только вносит путаницу при большом числе членов класса.
Первый же вариант лишён этих проблем.
Остаётся вопрос на всех ли Вам известных компиляторах Си и Си++ компилируется приведённый код?
В особенности интересует первый вариант. И если он так удобен, то почему им мало кто пользуется?
Здравствуйте, XuTMAH, Вы писали:
XTM>Проблема третьего варианта: член структуры имеет тип который не используется (_A3) и только вносит путаницу при большом числе членов класса.
"_A3" — это не обязательно.
Возможен такой вариант:
typedef struct A3 {
struct A3* next;
} A3;
Так, например, делает SDL:
typedef struct SDL_Rect {
Sint16 x, y;
Uint16 w, h;
} SDL_Rect;
XTM>Остаётся вопрос на всех ли Вам известных компиляторах Си и Си++ компилируется приведённый код?
Старенький lcc (версия компилятора ещё от 2004 года, Си) скопилировал, mingw 3.4.5 (Си, C++) — тоже, MS VC++ 6.0 (Си, C++) — аналогично, mingw 4.3.0 (Си, C++) — тоже, MS VC++ 2005 Express Edition (Си, C++) — тоже... Хватит, пожалуй
А насчёт последнего вопроса не в курсе, извините
XTM>>Проблема третьего варианта: член структуры имеет тип который не используется (_A3) и только вносит путаницу при большом числе членов класса.
AF>"_A3" — это не обязательно.
AF>Возможен такой вариант:
AF>AF>typedef struct A3 {
AF> struct A3* next;
AF>} A3;
AF>
Спасибо, не знал.
XTM>>Остаётся вопрос на всех ли Вам известных компиляторах Си и Си++ компилируется приведённый код?
AF>Старенький lcc (версия компилятора ещё от 2004 года, Си) скопилировал, mingw 3.4.5 (Си, C++) — тоже, MS VC++ 6.0 (Си, C++) — аналогично, mingw 4.3.0 (Си, C++) — тоже, MS VC++ 2005 Express Edition (Си, C++) — тоже... Хватит, пожалуй
Это всё под Windows, но также интересует Linux, Unix, Solaris, Mac OS и любая экзотика.
Здравствуйте, XuTMAH, Вы писали:
XTM>typedef struct _A3
XTM>{
XTM> struct _A3* next;
XTM>} A3;
XTM>Проблема третьего варианта: член структуры имеет тип который не используется (_A3) и только вносит путаницу при большом числе членов класса.
Есть ещё одна проблема: имя на подчёркивание и большую букву.
Пример кода сломанного из-за нарушения этой буквы стандарта —
http://www.gotw.ca/gotw/085.htm
Здравствуйте, XuTMAH, Вы писали:
XTM>Это всё под Windows, но также интересует Linux, Unix, Solaris, Mac OS и любая экзотика.
Язык Си от платформы не зависит.

А разнообразие компиляторов (интел, микрософт, гну) намекает, что это поведение стандартно, и этот пункт стандарта давно и хорошо поддерживается (в отличие от каких-нибудь поздних или труднореализуемых вещей; хотя разве в Си есть тёмные углы?)
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>