【发布时间】:2010-12-30 15:07:03
【问题描述】:
我可以在 c++/g++ 中做到这一点:
struct vec3 {
union {
struct {
float x, y, z;
};
float xyz[3];
};
};
那么,
vec3 v;
assert(&v.xyz[0] == &v.x);
assert(&v.xyz[1] == &v.y);
assert(&v.xyz[2] == &v.z);
会起作用的。
如何用 gcc 在 c 中做到这一点?我有
typedef struct {
union {
struct {
float x, y, z;
};
float xyz[3];
};
} Vector3;
但是我到处都遇到错误,特别是
line 5: warning: declaration does not declare anything
line 7: warning: declaration does not declare anything
【问题讨论】:
-
使用
-Wall再次编译您的代码。 GCC 应该给你关于不可移植匿名结构的警告。 -
即使在 C++ 中,这也是一个非常糟糕的主意,并且不能保证有效。
-
我不知道该放在哪里,但匿名结构和联合是 C11 标准的一部分。所以当下面的 cmets 说这是一个非标准的 GNU 扩展时,它现在已经过时了。
-
@sellibitze 你在说什么?原则上,这不是一个坏主意。他只是创建了一个联合,并在联合内部放置了一个结构和一个数组。他希望他们是匿名的,以减少成员访问的时间。
-
@solinent 只有 2 个 cmets:你不需要外部结构(你应该写
union vec3 { ... }),你应该将xyz成员命名为 other比xyz。e或comps之类的东西可以正常工作。
标签: c++ c struct anonymous unions