2012-02-29 3 views
3

Я написал следующую программу:Почему этот код C компилируется? C структура typdef

typedef struct blahblah { 
    int x; 
    int y; 
} Coordinate; 

int main() { 
    Coordinate p1; 
    p1.x = 1; 
    p1.y = 2; 

    //blah blah has not been declared as a struct, so why is it letting me do this? 
    struct blahblah p2; 
    p2.x = 5; 
    p2.y = 6; 
} 

Может кто-нибудь объяснить мне, что происходит?

+5

Я не совсем понимаю. 'struct blahblah', безусловно, * был объявлен как структура, он находится прямо в верхней части вашего примера. –

ответ

10

Вы сказали:

бла-бла не был объявлен как структура,

На самом деле, он имеет:

typedef struct blahblah { 
    int x; 
    int y; 
} Coordinate; 

Это и ЬурейеЕ Coordinate и определение struct blahblah. То, что определение говорит,:

  • определяет типа данных, который называется struct blahblah
  • Он имеет два члена, int x и int y.
  • Кроме того, сделать определение типа под названием Coordinate, что эквивалентно struct blahblah
0

Вы объявили blahblah как структура в вашем ЬурейеЕ. Typedef - просто простой способ ссылки на struct blahblah. Но структура blahblah существует, и поэтому вы можете дать ей typedef.

2

Ваше объявление структура эквивалентно

struct blahblah { 
    int x; 
    int y; 
}; 
typedef struct blahblah Coordinate; 

Поскольку это создает два названия для типа структуры (struct blahblah) и Coordinate, оба названия типа допустимы для объявления переменных.

2

typedef определяет новый пользовательский тип данных, но НЕ ДЕЛАЕТ аннулировать старое определение. Например, typedef int INT не будет аннулировать int. Аналогично, ваш blahblah по-прежнему является правильной определенной структурой! А Coordinate - это просто новый тип!

0

typedef используется для создания псевдонима одного типа для другого. Вы фактически объявляете «struct blahblah» в самом typedef. Это немного запутанно, но как @Timothy и другие отмечают, что это правильное определение.

Смежные вопросы