嵌套结构语法

时间:2011-09-07 22:12:33

标签: c

我有一个简单的问题..这些有什么区别:

struct myinnerstruct
{
    int x;

};

struct mystruct
{
    struct myinnerstruct m;
    int y;
};

和这个

struct mystruct
{
    int x;
    struct myinnerstruct
    {
        int y;
    };
    struct myinnerstruct m; 
};

这些都可以告诉我,但我想知道是否有理由选择其中一个。感谢

2 个答案:

答案 0 :(得分:7)

不同之处在于第二个无效。

结构声明中{}之间的内容是一系列成员声明。您的

    struct myinnerstruct
    {
        int y;
    };

是一种类型声明;它没有声明封闭结构的成员,因此在该上下文中它是非法的。

可以做的是:

struct mystruct
{
    int x;
    struct myinnerstruct
    {
        int y;
    } m;
};

m的声明是一个成员声明,​​所以没关系;它还声明了类型struct myinnerstruct。但在我看来,它的风格很差。 struct myinnerstruct声明完成后,struct mystruct类型仍然可见;请参阅下面的解释。

如果你真的想在这样的结构中使用结构,并且你不打算在其他任何地方使用struct myinnerstruct,那么你可以不带标记:

struct mystruct
{
    int x;
    struct
    {
        int y;
    } m;
};

但是,您可以将y声明为struct mystruct的成员。

如果您希望struct innerstruct成为命名类型,只需单独声明它,就像您在第一个示例中所做的那样。

以下是为什么 struct innerstruct仍然可见的解释。

C99 standard(大型PDF)第6.2.1节第2段说:

  

对于标识符指定的每个不同实体,   标识符可见(即,可以使用)仅在一个区域内   程序文本称为范围。由指定的不同实体   相同的标识符具有不同的范围,或者具有不同的名称   空间。范围有四种:函数,文件,块和   功能原型。 (函数原型是一个声明   声明其参数类型的函数。)

C90和C11标准的措辞基本相同。

结构声明中的{大括号}不定义块,也不定义任何其他可能的作用域,因此在大括号之间声明的任何内容都不限定为该区域;它必须限定在某些周围环境中。碰巧语法允许您在另一个结构定义中声明struct myinnerstruct - 但前提是它只是成员定义的一部分。我认为这只是因为该语言的设计者没有采取任何额外的努力来禁止它;这只是其他规则的副作用。你可以这样做,但我不推荐它。

答案 1 :(得分:1)

选择其中一个的理由是传统的期望。

嵌套在另一个中的结构声明不会在其他地方重复使用,即使它可以。

此外,由于没有并排放置相同级别的抽象,因此存在心理冲突。这样做是完全合法的,但它使得理解代码变得更难,也许更令人恼火。