我创建了结构:
typedef struct
{
short s;
int i;
struct Ss
{
short s;
};
} S;
我有一个错误(VS2012):
error C2020: 's' : 'struct' member redefinition
我看到使用了名称“s”,但它在嵌套的命名结构中,所以这不应该是个问题。
我知道在C11中有匿名的结构和联合,但在我的情况下,它不是匿名的,我有不支持C11的VS2012。
另一个有趣的例子是:
typedef struct
{
short s;
union U
{
int uu;
};
struct S
{
short ss;
};
union
{
int i;
double d;
};
} A;
有趣的想法是:在VS2008中sizeof(A)=24,但我只定义了一个字段。
当我使用代码时:
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,因为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 ;
} ;
关于c - 嵌套结构的C问题(看起来像是在没有显式定义的情况下定义了1个实例),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27167190/