Re[2]: typedef struct... и struct call...
От: Кодт Россия  
Дата: 26.06.04 19:42
Оценка: +1
Здравствуйте, TheIrix, Вы писали:

TI>В C при создании экземпляра второй вариант использутся с ключевым словом struct, а первый вариант — без него. В C++ разницы никакой нет, хотя для совместимости хорошо бы использовать первый вариант.

... а для строгой типизации — второй.

struct { int x; } v1; /* struct unnamed_1 (как компилятору захочется) */
struct { int x; } v2; /* struct unnamed_2 */

typedef struct { int x; } alias31, alias32; /* struct unnamed_3 */
alias01 v31;                                /* --"-- */
alias02 v32;                                /* --"-- */

struct tag4 { int x; } v41; /* struct tag4 */
struct tag4 v42;            /* --"-- */
typedef struct tag4 alias4; /* --"-- */
alias1 v43;                 /* --"-- */

typedef struct tag5 { int x; } alias5; /* struct tag5 */
struct tag5 v51;                       /* --"-- */
alias5      v52;                       /* --"-- */

В С++ при объявлении переменных и синонимов уже объявленного составного типа (struct,class,union,enum) можно пропускать декларатор struct...
tag1 v42;
typedef tag1 alias1;

Попробуйте скомпилировать определения (выше) с вот таким тестом:
void foo3(alias02* p) {}
void foo4(alias4* p) {}
void foo5(alias5* p) {}

int main()
{
    foo3(&v1);  foo4(&v1);  foo5(&v1);  /* warning (C) / error (C++) - преобразование указателей на разные типы */
    foo3(&v2);  foo4(&v2);  foo5(&v2);  /* --"-- */
    foo3(&v31); foo4(&v31); foo5(&v31); /* правильно только foo3 */
    foo3(&v41); foo4(&v41); foo5(&v41); /* ... foo4 */
    foo0(&v51); foo1(&v51); foo2(&v51); /* ... foo5 */
    v1  = v2;  /* ошибка - преобразование разных типов */
    v31 = v1;  /* --"-- */
    v31 = v41; /* --"-- */
    v41 = v42; /* правильно */
}
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.