В вашем примере, если мы рассмотрим имя переменных, объединение, скорее всего, не будет использоваться для доступа к одной и той же ячейке памяти, скажем, через x и r (поскольку радиус и координата x не подходят), но оставьте пользователя предоставить один и тот же аргумент для обоих. Намного проще установить x, y, z, w, когда вы используете декартовы координаты, и было бы неудобно использовать эти же имена для радиальных координат. И то, и другое проще, чем просто индексы массива. Возможно, у вас также есть другой параметр, который дает тип предоставленной координаты (декартовой или радиальной). Таким образом, у вас будет дискриминированный союз, как их называет pdbartlett.
В этом случае двойной уровень фигурных скобок бесполезен, так как массив может быть инициализирован либо через массив (двойной уровень фигурных скобок), либо через одну из внутренних структур.
коррекция : двойной уровень фигурных скобок позволяет избежать ввода входных данных в GLFloats.
Последняя деталь: неназванные внутренние структуры не являются стандартными C, стандартный способ сделать что-либо - дать имена внутренним структурам, как в
typedef union {
float flts[4];
struct {
float r;
float theta;
float phi;
float w;
} cartesian;
struct {
float x;
float y;
float z;
float w;
} radial;
} FltVector;
FltVector f = {1.0, 2.0, 3.0, 4.0 };
int main(int argc, char * argv[]){
printf("flts[0]=%f f.radial.r=%f f.cartesian.x=%f\n",
f.flts[0], f.radial.r, f.cartesian.x);
}