Alguns compiladores C ++ permitem uniões e estruturas anônimas como uma extensão do C ++ padrão. É um pouco de açúcar sintático que às vezes é muito útil.
Qual é a lógica que impede que isso faça parte do padrão? Existe um obstáculo técnico? Filosófico? Ou apenas não o suficiente para justificar isso?
Aqui está um exemplo do que estou falando:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
Meu compilador aceitará isso, mas avisa que "struct / union sem nome" é uma extensão não padrão para C ++ .
struct { int i; } a; a.i = 0;
(o tipo não tem nome). O segundo é este, que C ++ não suporta:struct { int i; }; i = 0;
(o tipo não tem nome e escapa para o escopo circundante). C ++, no entanto, faz suportar ambos sem nome e anônimos sindicatos .Respostas:
Como outros apontaram, uniões anônimas são permitidas no C ++ padrão, mas estruturas anônimas não.
A razão para isso é que C oferece suporte a uniões anônimas, mas não a estruturas anônimas *, portanto, C ++ oferece suporte ao primeiro para compatibilidade, mas não ao último porque não é necessário para compatibilidade.
Além disso, não há muito uso para estruturas anônimas em C ++. O uso que você demonstrar, ter uma estrutura que contém três carros alegóricos que podem ser referidos quer por
.v[i]
, ou.x
,.y
e.z
, eu acredito que resulta em um comportamento indefinido em C ++. C ++ não permite que você escreva para um membro de um sindicato, digamos.v[1]
, e depois leia de outro membro, digamos.y
. Embora o código que faz isso não seja incomum, na verdade não está bem definido.Os recursos do C ++ para tipos definidos pelo usuário fornecem soluções alternativas. Por exemplo:
* C11 aparentemente adiciona estruturas anônimas, portanto, uma revisão futura do C ++ pode adicioná-las.
fonte
Eu direi, você pode limpar sua
vector3
declaração usando apenas umunion
Claro, estruturas anônimas eram uma extensão do MSVC . Mas o ISO C11 permite isso agora, e o gcc permite , assim como o compilador llvm da Apple.
Por que em C11 e não em C ++ 11? Não tenho certeza, mas praticamente falando, a maioria dos compiladores C ++ (gcc ++, MSVC ++ e C ++ da Apple) os suporta.
fonte
Não tenho certeza do que você quer dizer. Seção 9.5 da especificação C ++, cláusula 2:
Você também pode fazer coisas assim:
Nem sempre muito útil ... embora às vezes útil em definições de macro desagradáveis.
fonte
Os sindicatos podem ser anônimos; ver a Norma, 9.5 parágrafo 2.
Que propósito você vê como uma estrutura ou classe anônima cumprindo? Antes de especular por que algo não está no padrão, gostaria de ter uma ideia de por que deveria estar, e não vejo um uso para uma estrutura anônima.
fonte
Com base na edição, nos comentários e neste artigo do MSDN: Anonymous Structures , arrisco um palpite - ele se encaixa mal com o conceito de encapsulamento. Eu não esperaria que um membro de uma classe mexesse com o namespace da minha classe além de simplesmente adicionar um membro. Além disso, as alterações na estrutura anônima podem afetar minha classe sem permissão.
fonte
Seu código
é como
o que é certamente inválido (em C99 e antes).
A razão é provavelmente para simplificar a análise (em C), porque nesse caso você só precisa verificar se o corpo da estrutura / união tem apenas "declarações do declarador" como
Dito isso, gcc e "outros compiladores" suportam campos sem nome como uma extensão.
Editar: estruturas anônimas agora são oficialmente suportadas em C11 (§6.7.2.1 / 13).
fonte
union { ... }
seja diferente destruct { ... }
. O primeiro é válido, mas o último não.union { ... };
inválido não está correto.