一些C++编译器允许匿名联合和结构作为标准C++的扩展.这有点语法糖,偶尔会非常有帮助.
阻止它成为标准一部分的理由是什么?是否存在技术障碍?一个哲学的?或者仅仅是不足以证明它的合理性?
这是我正在谈论的样本:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
Run Code Online (Sandbox Code Playgroud)
我的编译器会接受这个,但它警告"无名结构/联合"是C++的非标准扩展.
C11支持匿名结构,如下所示:
struct Foo
{
struct
{
size_t x, y;
};
};
struct Foo f;
f.x = 17;
f.y = 42;
Run Code Online (Sandbox Code Playgroud)
基本上,这样的成员struct被视为封闭的成员struct或union(如果封闭结构本身是匿名的,则递归地).
C++ 11的理由是什么,还包括匿名结构?当然,它们只是非常有用(主要是在工会内部,以消除标识符的输入struct).但它们似乎是对规范的明显补充(以及已经由许多编译器实现的规范),它们肯定必须经过讨论,至少是为了保持与C11标准的兼容性.那他们为什么不加?
我不确定问题是否妥善,因为我理解了如何,但我不知道用不明白的东西写问题.这里是:
我有一些课程:
class Animal{};
class Rabbit{}: public Animal;
class Horse{}: public Animal;
class Mouse{}: public Animal;
class Pony{}: public Horse;
Run Code Online (Sandbox Code Playgroud)
我的目标是从此对象列表中找到最大大小,以便在之后的内存分配中使用它.我已将每个sizeof对象存储在一个数组中,然后获取数组的最大值.上级(我发送代码进行审核)建议我使用union来在编译前的时间找到最大的大小.这个想法对我来说似乎很好,所以我这样做了:
typedef union
{
Rabbit rabbitObject;
Horse horseObject;
Mouse mouseObject;
Pony ponyObject;
} Size;
Run Code Online (Sandbox Code Playgroud)
...因为union根据最大元素分配内存.下一个建议就是这样做:
typedef union
{
unsigned char RabbitObject[sizeof(Rabbit)];
unsigned char HorseObject[sizeof(Horse)];
unsigned char MouseObject[sizeof(Mouse)];
unsigned char PonyObject[sizeof(Pony)];
} Interesting;
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Interestingunion 如何获得对象的最大大小?对我来说,创建一个unsigned char类型的数组是没有意义的sizeof(class).为什么第二个选项可以解决问题,而之前的联盟却没有?背后发生了什么,我想念?
PS:条件是这样的,我不能亲自问这个家伙.
先感谢您