在C语言中,结构,定义上的细微差别

时间:2017-06-07 19:03:15

标签: c tags structure definition

我在下面看到了用于定义结构的格式

FullTimeUKEmployee

有些地方我看到下面的格式来定义结构

typedef struct Tag 
{
  type Member1;
  type Member2;
  <and so on..>
};

有些地方我看到下面的格式来定义结构

typedef struct Tag 
{
  type Member1;
  type Member2;
  <and so on..>
} Tag;

如果您注意到typedef struct { type Member1; type Member2; <and so on..> } Tag; 语法位于Tag之后,也位于结束时。

问题。

1)3?

之间有什么区别?

2)一个人比另一个人更受欢迎,或者你最好的条件何时可以使用另一个?

2 个答案:

答案 0 :(得分:4)

根据C标准(6.2.3标识符的名称空间)

  

1如果可以看到多个特定标识符的声明   在翻译单元的任何一点,句法语境   消除引用不同实体的用法。因此,有   各种标识符的单独名称空间,如   如下:

     

- 标签名称(通过标签声明的语法消除歧义   并使用);

     

- 结构,联合和枚举的标记(消除歧义   关注关键字struct,union或enum)的任何32);

     

- 结构或工会的成员;每个结构或联合都有一个   为其成员分隔名称空间(根据类型的歧义消除歧义)   用于通过访问成员的表达式。或 - &gt;操作者);

     

- 所有其他标识符,称为普通标识符(在   普通的声明符或作为枚举常量)。

这是

struct Tag 
{
  type Tag;
  <and so on..>
};

一个名为Tag的结构声明,同时它是一个结构定义,因为它不仅引入了类型struct Tag,还声明了它的成员。

您可能首先声明一个结构然后定义它。例如

#include <stdio.h>

struct Tag;

struct Tag
{
    int Tag;
};

int main(void) 
{
    struct Tag Tag = { .Tag = 10 };

    printf( "Tag.Tag = %d\n", Tag.Tag );

    return 0;
}

程序输出

Tag.Tag = 10

在此声明中

struct Tag 
{
  type Tag;
  <and so on..>
} Tag;

声明了一个struct Tag类型的对象,其标识符为Tag。该结构具有名为Tag的数据成员。因此,声明了两个实体:类型struct Tag和结构类型名称为Tag的对象。

在此声明中

struct 
{
  type Tag;
  <and so on..>
} Tag;

声明了一个具有标识符Tag的未命名结构类型的对象。这个声明的问题是你不能引用对象的类型。

您可以再举行一次声明,例如

typedef struct Tag 
{
  type Tag;
  <and so on..>
} Tag;

在此typedef声明中,标识符Tag充当struct Tag类型的别名。

或者

typedef struct  
{
  type Tag;
  <and so on..>
} Tag;

在此typedef声明中,标识符Tag充当未命名结构类型的别名。

C 2011允许声明匿名结构。 来自C标准(6.7.2.1结构和联合说明符)

  

13没有标记的结构类型的未命名成员称为   匿名结构;没有标记的联合类型的未命名成员   称为匿名联盟。匿名结构的成员或   工会被认为是包含结构的成员或   联盟。如果包含结构或联合,这将递归应用   也是匿名的。

答案 1 :(得分:1)

第一个示例为名为Tag的结构创建定义。第二个还创建一个名为Tag的变量(恰好是Tag结构)。第三个创建一个名为Tag的变量,该变量具有指定的结构 - 但结构永远不会被命名,因此您无法再次使用它。

使用哪个?我个人使用第一个并单独声明任何类型的Tag变量。如果你试图消除一行代码,第二个工作正常。如果你只想使用一次结构,你可以使用第三个结构。