C语言的匿名结构体,匿名联合体

c++很早就支持了,c99标准没有这条,最新的c11标准才有,但是其实现在的编译器都支持哦。


struct{
struct {
int inner_mem1;
int inner_mem2;
};
int mem1;
char mem2;
}st;

st.inner_mem1 = 1;

这是可以通过gcc的编译的,里面的struct没有名字,他包含的成员和st所包含的成员是在同一作用域下的。所以st.inner_mem1访问的正是ST中那个没有名字的结构题。
同样的还可以套用在结构体上

struct{
union{
int inner_mem1;
int inner_mem2;
};
int mem1;
char mem2;
}st;

这个叫做anonymous structure 和 anonymous union,特别是struct中间放union的很好用哦,在一些协议中比较长用到,
至少我不要st.innerUnion.someVar来用struct中的Union,可以直接st.someVar方便多了。听说这个最早是plan9的编译器中引入的。看来plan9虽然没有成功,但是留下来了不少好东西(Unicode也是一个哦)。
PS:
那么这样呢?

struct{
struct {
int mem1;
char mem2;
int inner_mem1;
int inner_mem2;
};
int mem1;
char mem2;
}st;
st.mem1 = 1;

这在gcc上还是可以通过编译,不信你去试试看,那么这里访问的mem1是哪个mem1呢??答案是st中的mem1
不信我们可以验证一下

void * p = NULL;
p = &st;
st.mem1 = 123
printf("%d", *(int*)p)

结果输出的是0,说明mem1用的是st中的mem1。

Comments

Popular posts from this blog

socket close shutdown函数区别

批量在文件头插入

hash表取模技巧