我创建了结构:

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/

10-15 00:49
查看更多