Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是C11匿名结构吗?_C_Struct_C11_Anonymous Struct - Fatal编程技术网

这是C11匿名结构吗?

这是C11匿名结构吗?,c,struct,c11,anonymous-struct,C,Struct,C11,Anonymous Struct,我在研究C11草案,它说 没有标记的结构类型的未命名成员称为匿名结构;没有标记的联合类型的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员 因此,我构建了以下测试用例 //不带标记的结构类型 类型定义结构{ 无符号字符a; 无符号字符b; //……其他一些成员。。。 无符号字符w; }环礁; 联盟 { AToW;//不,那不是未命名的成员 例如: struct-outer{ INTA; 结构{ int b; INTC; }; int d; }; 包含成员b和c的内部结构是

我在研究C11草案,它说

没有标记的结构类型的未命名成员称为匿名结构;没有标记的联合类型的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员

因此,我构建了以下测试用例

//不带标记的结构类型
类型定义结构{
无符号字符a;
无符号字符b;
//……其他一些成员。。。
无符号字符w;
}环礁;
联盟
{

AToW;//不,那不是未命名的成员

例如:

struct-outer{
INTA;
结构{
int b;
INTC;
};
int d;
};
包含成员
b
c
的内部结构是
struct outer
的未命名成员。此未命名成员的成员
b
c
被视为包含结构的成员

对于包含的联合而不是包含的结构,这可能更有用。特别是,它可以用于定义类似于Pascal或Ada变体记录的内容:

enum variant_type{t_int,t_double,t_指针,t_对};
结构变体{
枚举变量_类型;
联合{
int i;
双d;
void*p;
结构{
int x;
int-y;
};
};
};
这允许您直接将
i
d
p
作为
struct variant
对象的成员引用,而不是为variant部分创建人工名称。如果某些变体需要多个成员,则可以在匿名联合中嵌套匿名结构

(它与Pascal和Ada的不同之处在于,在给定
类型
成员的值时,没有机制强制哪个变量处于活动状态;这就是C。)

在您的示例中,
AToW
是您先前定义的结构类型的typedef。您不允许有一个空的

AToW;
在一个结构定义的中间,你可以有一个空的

int;
C11增加了在另一个结构中定义嵌套匿名结构的功能,但只能在此时定义一个新的匿名结构类型。你不能有一个以前定义类型的匿名结构成员。语言可以定义为允许它,语义也可以(我想)简单一点——但定义两种不同的方法来做同一件事并没有多大意义

引用第6.7.2.1节第13段(与发布的2011 ISO C标准非常接近):

一个未命名的成员,其类型说明符是具有 没有标记被称为匿名结构;类型为 说明符是没有标记的联合说明符,称为匿名说明符 联合。将考虑匿名结构或联合的成员 成为包含结构或联合的成员。这适用于 递归地,如果包含的结构或联合也是匿名的


结构说明符包括关键字
struct
,后跟可选标识符(标记,在本例中省略),后跟
{
}中包含的一系列声明
。在您的例子中,
AToW
是一个类型名称,而不是结构说明符,因此它不能用于定义匿名结构。

我不认为这就是匿名结构。请注意“tag”一词。这是结构或联合的类型标记,如
struct foo{…}f;
-这里是“foo”是标记。@user3477950是的,
AToW
没有标记。值得注意的是,为了与Plan9和Microsoft兼容,Clang和GCC似乎都允许您将AToW用作扩展。我看不出这与我的情况有什么区别,除了您使用结构说明符作为类型,我使用普通标识符作为扩展之外键入。为什么我的
AToW;
不是未命名的成员?如果我将其更改为
AToW x;
,它将成为已命名的成员。@johanneschaub litb:请参阅我答案的更新后的最后一段。(TL;DR:因为标准如此规定。)“不允许有一个裸露的数据;在一个结构定义的中间,除了你可以有一个空的int”;“我给出的引用不允许它吗?”一个没有标签的结构类型的未命名成员被称为匿名结构;没有标签的未命名的联合类型成员被称为匿名联盟。然后继续定义它的语义。所以问题归结为“为什么是AToW;不是匿名结构?”我还没有看到它。“int;”不是,因为“int”不是结构类型,这很简单。“你不能有以前定义类型的匿名结构成员。”,我对规范中的一段话非常感兴趣。这确实可以回答我的问题。谢谢,似乎新的草案解决了这个问题。所有的困惑都来自与一位朋友的谈话,他告诉我,
struct a{struct B;}将包含一个匿名结构。这将是与C++不兼容的,所以我想看看,发现一个可能使用<代码> TyPulfF。但是我好像使用了一个太老的草稿。