Почему этот код C компилируется?C struct typdef - PullRequest
3 голосов
/ 29 февраля 2012

Я написал следующую программу:

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 ]

10 голосов
/ 29 февраля 2012

Вы сказали:

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

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

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

Этои typedef Coordinate, и определение struct blahblah.Определение гласит:

  • определяет тип данных с именем struct blahblah
  • . Он состоит из двух членов: int x и int y.
  • Также создайте определение типа с именем Coordinate, которое эквивалентно struct blahblah
2 голосов
/ 29 февраля 2012

typedef определяет новый пользовательский тип данных, но НЕ делает недействительным старое определение . Например, typedef int INT не сделает недействительным int. Точно так же ваша blahblah все еще является допустимой определенной структурой! И координата это просто новый тип!

2 голосов
/ 29 февраля 2012

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

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

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

0 голосов
/ 29 февраля 2012

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

0 голосов
/ 29 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...