嵌套结构的C问题(看起来1个实例是在没有显式定义的情况下定义的)
我已经创建了struct:嵌套结构的C问题(看起来1个实例是在没有显式定义的情况下定义的),c,visual-studio-2012,struct,unions,C,Visual Studio 2012,Struct,Unions,我已经创建了struct: typedef struct { short s; int i; struct Ss { short s; }; } S; 我有一个错误(VS2012): 我看到使用了名称“s”,但它位于嵌套的命名结构中,因此应该不会有问题。 我知道在C11中引入了匿名的OUDS结构和联合,但在我的例子中它不是匿名的,我有不支持C11的VS2012 另一个有趣的例子是: typedef struct { short
typedef struct
{
short s;
int i;
struct Ss
{
short s;
};
} S;
我有一个错误(VS2012):
我看到使用了名称“s”,但它位于嵌套的命名结构中,因此应该不会有问题。
我知道在C11中引入了匿名的OUDS结构和联合,但在我的例子中它不是匿名的,我有不支持C11的VS2012
另一个有趣的例子是:
typedef struct
{
short s;
union U
{
int uu;
};
struct S
{
short ss;
};
union
{
int i;
double d;
};
} A;
有趣的是:在VS2008中,sizeof(A)=24,但我只定义了1个字段。
当我使用代码时:
A a = {1, 2, 3, 4};
printf("A.s=%d A.uu=%d A.ss=%d A.i=%d \n", a.s, a.uu, a.ss, a.i);
输出为:
A.s=1 A.uu=2 A.ss=3 A.i=4
所以我的问题是:为什么是这样,它是正确的行为吗?您的第一个示例不是C,因为部分
结构Ss{short s}代码>不声明名称或不是匿名成员。如果VS允许,那么它必须是一个扩展。它应该是:
typedef struct
{
short s;
int i;
struct Ss
{
short s;
} m ;
} S;
或者,如果您有C11:
typedef struct
{
short s;
int i;
struct //anonymous structure
{
short s2 ;
} ;
} S;
在这种情况下,最后一个成员的名称必须不同
只是C11中的一个匿名结构的余数:
6.7.2.1第13页
类型说明符为结构说明符且没有标记的未命名成员称为
匿名结构;类型说明符为具有的联合说明符的未命名成员
没有标记被称为匿名联合。匿名结构或联盟的成员
被视为包含结构或联合的成员。这是适用的
递归地,如果包含的结构或联合也是匿名的
这使其成为匿名结构:
struct //note the missing tag
{
int name ;
} ;
第一个示例不是C,因为部分struct Ss{short s}代码>不声明名称或不是匿名成员。如果VS允许,那么它必须是一个扩展。它应该是:
typedef struct
{
short s;
int i;
struct Ss
{
short s;
} m ;
} S;
或者,如果您有C11:
typedef struct
{
short s;
int i;
struct //anonymous structure
{
short s2 ;
} ;
} S;
在这种情况下,最后一个成员的名称必须不同
只是C11中的一个匿名结构的余数:
6.7.2.1第13页
类型说明符为结构说明符且没有标记的未命名成员称为
匿名结构;类型说明符为具有的联合说明符的未命名成员
没有标记被称为匿名联合。匿名结构或联盟的成员
被视为包含结构或联合的成员。这是适用的
递归地,如果包含的结构或联合也是匿名的
这使其成为匿名结构:
struct //note the missing tag
{
int name ;
} ;