我需要在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 } };
但是,如果这样做,它将提供相同的输出而没有警告。
我希望这澄清一下!
答案 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;};
};