// 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] и т.п. для выделения фрагментов кода. -- ПК.
Здравствуйте, 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)
Здравствуйте, 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;