Работа со структурой
От: said222  
Дата: 07.01.04 14:07
Оценка:
// 1 структура
typedef struct {
    BOOL keyDown [256];
} Keys;


//2 структура
typedef struct Keys {
        BOOL keyDown [256];
};


//3 структура
typedef struct RGB {
        unsigned char red;
        unsigned char green;
        unsigned char blue;
} RGB_color, *RGB_color_ptr;


Объясните, плиз, в чем между ними разница (в объявлении и использовании)

Исправлено форматирование. Пожалуйста, пользуйтесь тэгами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
Re: Работа со структурой
От: Lorenzo_LAMAS  
Дата: 07.01.04 14:20
Оценка:
Здравствуйте, said222, Вы писали:
S>// 1 структура
S>typedef struct {
S>    BOOL keyDown [256];
S>} Keys;

Здесь определение безымянной структуры и одновременно typedef — объявление, которое вводит имя Keys для данной безымянной структуры.
S>//2 структура
S>typedef struct Keys {
S>        BOOL keyDown [256];
S>};

Здесь определение структуры Keys и пустой тайпдеф — ключевое слово typedef тут совершенно ненужно, о чем предупреждает компилятор, typedef можно смело выкинуть.
S>//3 структура
S>typedef struct RGB {
S>        unsigned char red;
S>        unsigned char green;
S>        unsigned char blue;
S>} RGB_color, *RGB_color_ptr;

Определяется структура RGB и объявляются имена типов RGB_color (просто синоним для RGB) и RGB_color_ptr — а это имя типа — указателя на структуру RGB (или RGB_color)
Of course, the code must be complete enough to compile and link.
Re: Работа со структурой
От: Кодт Россия  
Дата: 07.01.04 14:24
Оценка:
Здравствуйте, said222, Вы писали:
S>// 1 структура
S>typedef struct {
S>    BOOL keyDown [256];
S>} Keys;


S>//2 структура
S>typedef struct Keys {
S>        BOOL keyDown [256];
S>};


S>//3 структура
S>typedef struct RGB {
S>        unsigned char red;
S>        unsigned char green;
S>        unsigned char blue;
S>} RGB_color, *RGB_color_ptr;

S>Объясните, плиз, в чем между ними разница (в объявлении и использовании)

В языке C (не C++) структура объявляется так:
struct Tagname { ...... };

и в дальнейшем используется как
struct Tagname my_var;
struct Tagname *my_ptr;
void foo(struct Tagname arg);
// и даже так:
void Tagname(); // никакого конфликта имен нет!

Причем допускаются анонимные структуры:
struct { ..... } my_var;

Объявление синонима типа, typedef, по форме совпадает с объявлением переменной. Соответственно,
struct { ..... } my_var, *my_ptr; // переменные анонимной структуры

typedef
struct { ..... } MyType, *MyPtr; // синонимы типа

//-----------------------

struct MyTag { ..... }; // объявление структуры

struct MyTag my_var, *my_ptr;

typedef
struct MyTag MyType, *MyPtr;

//-----------------------

struct MyTag { ..... } my_var, *my_ptr; // и объявление структуры, и переменные

typedef
struct MyTag { ..... } MyType, *MyPtr;

То же касается других составных типов — союзов (union) и перечислений (enum).

В языке C++ такая форма объявления — рудимент. То есть она приемлема, но не нужна. Более того, исходный тип имеет имя не "struct MyTag", а просто "MyTag".
struct MyTag { ..... };

MyTag my_var;
typedef MyTag *MyPtr;
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.