struct decalaration之后的数组定义

时间:2018-03-26 09:47:25

标签: c struct

在结构定义之后,我遇到了一个非常不寻常的数组定义。我找不到任何关于此的具体信息。那么请您告诉我这里发生了什么以及这种语法/符号的可能用途或优点是什么?

typedef struct MYSTRUCT {
 //members
} mystruct_t;

输出:

  

0 => 0这是A,1 => 1这是B

我已经知道结构声明如下:

mystruct_t s[] = { /* */ };

然后我会创建数组:

if pygame.event.type == pygame.MOUSEBUTTONUP:
    print 'check1'
    if pygame.event.button == RIGHT:
        print "check2"

3 个答案:

答案 0 :(得分:3)

声明一个类型为magic的数组struct MAGIC,它由两个立即初始化的元素组成。

未明确指定数组大小;它源自初始化程序的数量。一个优点是,如果您以后需要其他(初始化)元素,您可以只提供初始化程序,而不需要为调整数组大小规范而烦恼。

答案 1 :(得分:1)

在声明该类型的对象之前,您不需要为结构创建单独的typedef。您展示的代码完全等同于:

struct MAGIC { int a; char *b; }; // define the struct type
struct MAGIC magic[] = { ... };   // create an array of that type.  

C允许您将结构定义与数组的声明组合在一起;结构定义是完成,结束},因此从那时起,您可以创建该类型的实例,而无需使用单独的声明语句。

您可以对非数组对象执行相同的操作:

struct MAGIC { 
  int a;
  char *b;
} foo, // single instance of struct MAGIC,
  *bar, // pointer to instance of struct MAGIC,
  *bletch( void ); // function returning pointer to struct MAGIC

当然,我们中的许多人会认为将结构定义与声明分开并分别声明每个实例是更好的风格:

struct MAGIC { 
  int a;
  char *b; 
};

struct MAGIC foo;
struct MAGIC *bar;
struct MAGIC *bletch( void ); 

如果您愿意,可以使用typedef;有些人认为他们使代码更清晰,更容易理解。就个人而言,我觉得如果该类型的用户必须知道它的" struct-ness" (IOW,必须访问个人成员),然后使用typedef更好 - 留下" struct-ness"明确。

答案 2 :(得分:0)

那个人正在做类似下面的事情

struct MAGIC {
int a;
char* b;
};

int main()
{
   struct MAGIC magic[2];
   magic[0].a = 0;
   magic[0].b = "this is A";
   magic[1].a = 1;
   magic[1].b = "this is B";
   printf("0=>%d %s, 1=>%d %s\r\n",
   magic[0].a, magic[0].b,
   magic[1].a, magic[1].b);
   return 0;
}