[?] typedef/struct c/c++
От: XuTMAH  
Дата: 12.02.09 21:08
Оценка:
Структура должна иметь следующий вид

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) и только вносит путаницу при большом числе членов класса.
Первый же вариант лишён этих проблем.

Остаётся вопрос на всех ли Вам известных компиляторах Си и Си++ компилируется приведённый код?
В особенности интересует первый вариант. И если он так удобен, то почему им мало кто пользуется?
Re: [?] typedef/struct c/c++
От: Alexey F  
Дата: 12.02.09 22:50
Оценка:
Здравствуйте, 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++) — тоже... Хватит, пожалуй

А насчёт последнего вопроса не в курсе, извините
Re[2]: [?] typedef/struct c/c++
От: XuTMAH  
Дата: 13.02.09 06:49
Оценка:
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 и любая экзотика.
Re: [?] typedef/struct c/c++
От: Alexander G Украина  
Дата: 13.02.09 06:56
Оценка: 6 (1)
Здравствуйте, XuTMAH, Вы писали:


XTM>typedef struct _A3

XTM>{
XTM> struct _A3* next;
XTM>} A3;

XTM>Проблема третьего варианта: член структуры имеет тип который не используется (_A3) и только вносит путаницу при большом числе членов класса.


Есть ещё одна проблема: имя на подчёркивание и большую букву.
Пример кода сломанного из-за нарушения этой буквы стандарта — http://www.gotw.ca/gotw/085.htm
Русский военный корабль идёт ко дну!
Re[3]: [?] typedef/struct c/c++
От: Кодт Россия  
Дата: 13.02.09 10:28
Оценка: +1
Здравствуйте, XuTMAH, Вы писали:

XTM>Это всё под Windows, но также интересует Linux, Unix, Solaris, Mac OS и любая экзотика.


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