Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
嵌套结构的C问题(看起来1个实例是在没有显式定义的情况下定义的)_C_Visual Studio 2012_Struct_Unions - Fatal编程技术网

嵌套结构的C问题(看起来1个实例是在没有显式定义的情况下定义的)

嵌套结构的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

我已经创建了struct:

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 ;
} ;