我在下面看到了用于定义结构的格式
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)一个人比另一个人更受欢迎,或者你最好的条件何时可以使用另一个?
答案 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变量。如果你试图消除一行代码,第二个工作正常。如果你只想使用一次结构,你可以使用第三个结构。