typedef struct... и struct call...
От: elfin  
Дата: 25.06.04 21:55
Оценка:
Какие отличия между:

typedef struct {
int a;
///……………………….
} call;

и

struct call {
int a;
///……………………….
};

Что лучше использовать?
Re: typedef struct... и struct call...
От: TheIrix  
Дата: 26.06.04 06:54
Оценка:
Здравствуйте, elfin, Вы писали:

E>Какие отличия между:


E>typedef struct {

E>int a;
E>///……………………….
E>} call;

E>и


E>struct call {

E>int a;
E>///……………………….
E>};

E>Что лучше использовать?


В C при создании экземпляра второй вариант использутся с ключевым словом struct, а первый вариант — без него. В C++ разницы никакой нет, хотя для совместимости хорошо бы использовать первый вариант.
Re: typedef struct... и struct call...
От: _nn_  
Дата: 26.06.04 07:12
Оценка:
Здравствуйте, elfin, Вы писали:

E>Какие отличия между:

E>typedef struct {
E>int a;
E>///………………………. 
E>} call;

E>и

E>struct call {
E>int a;
E>///………………………. 
E>};

E>Что лучше использовать?

Для языка С :
// Объявление
struct call
{ int a; };
// Использование
struct call mycall;

// Объявление
typedef struct call
{ int a; };
// Использование
call mycall;

// Объявление
typedef struct _call
{ int a; };
// Объявляем синоним
typedef struct _call call;
// Использование
call mycall;


Используется в основном вариант 3 — так как это позволяет и использовать имя структуры и позволяет использовать синоним ее (typedef) без написания struct.

Второй и третий варианты одинаковы за исключением того что в третьем название структуры заданно.

Для языка С++ :
// Объявление
struct call
{ int a; };
// Использование
/*struct*/ call mycall; // struct можно не писать, компилятор сделает это за нас, но если написать ошибки не будет.

// Объявление
typedef struct call
{ int a; };
// Использование
call mycall;

// Объявление
typedef struct _call
{ int a; };
// Объявляем синоним
typedef /*struct*/ _call call; // struct здесь можно тоже не писать
// Использование
call mycall;


Используется в основном вариант 1 — так как struct ставится компилятором автоматически за нас и не требуется typedef.
http://rsdn.nemerleweb.com
http://nemerleweb.com
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 >>
Перекуём баги на фичи!
Re: typedef struct... и struct call...
От: Vamp Россия  
Дата: 28.06.04 07:03
Оценка:
E>Что лучше использовать?
Литературу.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.