为什么这个C代码编译? C struct typedef

时间:2012-02-29 05:15:36

标签: c compiler-construction struct

我写了以下程序:

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 个答案:

答案 0 :(得分:10)

你说:

  

blah blah尚未被声明为结构,

实际上,它有:

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

这既是typedef Coordinate,也是struct blahblah的定义。定义的含义是:

  • 定义名为struct blahblah
  • 的数据类型
  • 它有两个成员int xint y
  • 此外,制作一个名为Coordinate的类型定义,该定义等同于struct blahblah

答案 1 :(得分:2)

您的结构声明等同于

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

由于这会为结构类型(struct blahblah)和Coordinate创建两个名称,因此两个类型名称都允许用于声明变量。

答案 2 :(得分:2)

typedef定义了新的用户定义数据类型,但不会使旧定义无效。例如,typedef int INT不会使int无效。同样,您的blahblah仍然是有效的定义结构!而Coordinate只是一种新型!

答案 3 :(得分:0)

你在你的typedef中声明blahblah是一个结构。 typedef只是引用struct blahblah的简单方法。但是结构blahblah存在,这就是为什么你可以给它一个typedef。

答案 4 :(得分:0)

typedef用于创建一种类型的别名。你实际上是在typedef本身声明'struct blahblah'。这有点令人困惑,但正如@Timothy和其他人所说,这是一个有效的定义。