Здравствуйте, 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 >>