Estruturas e Uniões
AggregateDeclaration:
Tag { DeclDefs }
Tag Identifier StructBody
Tag Identifier ;
Tag:
struct
union
StructBody:
{ }
{ StructBodyDeclarations }
StructBodyDeclarations:
StructBodyDeclaration
StructBodyDeclaration StructBodyDeclarations
StructBodyDeclaration:
Declaration
Invariant
UnitTest
StructAllocator
StructDeallocator
StructAllocator:
ClassAllocator
StructDeallocator:
ClassDeallocator
Elas trabalham como fazem em C, com as seguintes
exceções:
- sem campos de bits
- alinhamento pode ser explicitamente especificado
- nenhum espaço de nome de etiqueta separado -
nomes de etiquetas vão no escopo atual
- declarações como:
struct ABC x;
não são permitidas, substitua por:
ABC x;
- estruturas/uniões anonimas são
permitidas como membros de outras estruturas/uniões
- Inicializadores padrão para membros podem ser
fornecidos.
- Funções membro e membros
estáticos são permitidos.
Estruturas e uniões são entendidos como simples
agregações de dados, ou como um modo de pintar
uma estrutura de dados sobre hardware ou um tipo externo. Tipos
externos podem ser definidos pela API do sistema operacional, ou por um
formato de arquivo. Características orientadas a objeto
são providas com o tipo de dado da classe.
Inicialização Estática de
Estruturas
Membros estáticos de estruturas são por padrão
inicializados para o que quer que o inicializador padrão para o
membro seja, e se nenhum é fornecido, para o inicializador
padrão para o tipo do membro. Se um inicializador
estático é fornecido, os membros são inicializados
pelo nome do membro, dois pontos, sintaxe da expressão. Os
membros podem ser inicializados em qualquer ordem. Membros não
especificados na lista do inicializador são por inicializados de
forma padrão.
struct X { int a; int b; int c; int d = 7;}
static X x = { a:1, b:2}; static X z = { c:4, b:5, a:2 , d:5};
Inicialização estilo C, baseada na ordem dos membros na
declaração da estrutura, também é
suportada:
static X q = { 1, 2 };
Inicialização Estática de Uniões
Uniões são inicializadas explicitamente.
union U { int a; double b; }
static U u = { b : 5.0 };
Outros membros da união que cobrem o inicializador, mas acupam
mais armazenamento, tem o armazenamento extra inicializado para zero.
Propriedades de Estruturas
.sizeof Tamanho da estrutura em bytes
.alignof Tamanho limite que a estrutura precisa para ser alinhada
Propriedades de Campos de Estruturas
.offsetof Deslocamento em bytes do campo a partir do começo
da estrutura