匿名结构

时间:2014-08-09 10:15:42

标签: c gcc struct c11

我需要在struct test中嵌入一个匿名结构,以便它设置如下:

#include <stdio.h>

struct test {
    char name[20];

    struct {
        int x;
        int y;
    };
};

int main(void) {
    struct test srs = { "1234567890123456789", 0, 0 };
    printf("%d\n", srs.x); // I can access x property without having to go to go within another struct
    return 0;
}

这样我就可以访问x和y属性而无需转到另一个结构中。

但是我希望能够使用在其他地方声明的结构定义:

struct position {
    int x;
    int y;
}

我无法编辑上面的结构!

因此,例如,一些伪代码可能是:

#include <stdio.h>

struct position {
    int x;
    int y;
};

struct test {
    char name[20];

    struct position;
};

int main(void) {
    struct test srs = { "1234567890123456789", 0, 0 };
    printf("%d\n", srs.x); // I can access x property without having to go to go within another struct
    return 0;
}

然而,这给出了:

warning: declaration does not declare anything
In function 'main':
error: 'struct test' has no member named 'x'

更新:一些评论者想知道如何初始化这样的结构,所以我写了一个简单的程序供你试验,确保按照答案用-fms-extensions进行编译!

#include <stdio.h>

struct position {
    int x;
    int y;
};

struct test {
    char name[20];

    struct position;
};

int main(void) {
    struct test srs = { "1234567890123456789", 1, 2 };
    printf("%d\n", srs.x);
    return 0;
}

输出为1,这是您所期望的。

没有必要:

struct test srs = { "1234567890123456789", { 1, 2 } };

但是,如果这样做,它将提供相同的输出而没有警告。

我希望这澄清一下!

2 个答案:

答案 0 :(得分:6)

根据c11标准,可以在gcc中使用匿名结构。使用-fms-extensions编译器选项将允许您想要的匿名结构化功能。

文档的相关摘录:

  

除非使用-fms-extensions,否则未命名字段必须是结构   或没有标记的联合定义(例如,'struct {int a;};')。   如果使用-fms-extensions,则该字段也可以是带有a的定义   标签,例如'struct foo {int a; };',对先前的引用   定义的结构或联合,例如'struct foo;',或对a的引用   先前定义的结构或联合类型的typedef名称。

请参阅:this page了解更多信息。

答案 1 :(得分:1)

#define position {int x; int y;}

struct test {
    char name[20];

    struct position;
};

扩展为:

struct test {
    char name[20];

    struct {int x; int y;};
};