O primeiro é o mais fácil ( envolve menos digitação ) e é garantido que funcione, todos os membros serão configurados para 0
[Ref 1] .
O segundo é mais legível.
A escolha depende da preferência do usuário ou daquela que seu padrão de codificação exige.
[Ref 1] Referência C99 Padrão 6.7.8.21:
Se houver menos inicializadores em uma lista entre chaves do que elementos ou membros de um agregado, ou menos caracteres em um literal de string usado para inicializar uma matriz de tamanho conhecido do que elementos na matriz, o restante do agregado deve ser inicializado implicitamente da mesma forma que os objetos que têm duração de armazenamento estático.
Boa leitura:
C e C ++: inicialização parcial da estrutura automática
= {};
No entanto, não tenho certeza se isso é válido.foo = {0}
significa. Se eu vissefoo = ZERO_FULL
, teria que pesquisar a definição de ZERO_FULL.Se os dados forem uma variável estática ou global, eles são preenchidos com zero por padrão, então apenas declare-os
myStruct _m;
Se os dados forem uma variável local ou uma zona alocada no heap, limpe-os com
memset
:Os compiladores atuais (por exemplo, versões recentes de
gcc
) otimizam isso muito bem na prática. Isso funciona apenas se todos os valores zero (incluindo ponteiros nulos e zero de ponto flutuante) forem representados como todos os bits zero, o que é verdadeiro em todas as plataformas que conheço (mas o padrão C permite implementações onde isso é falso; não conheço essa implementação) .Você poderia talvez codificar
myStruct m = {};
oumyStruct m = {0};
(mesmo se o primeiro membro demyStruct
não for um escalar).Meu sentimento é que usar
memset
para estruturas locais é o melhor, e transmite melhor o fato de que em tempo de execução, algo deve ser feito (enquanto normalmente, dados globais e estáticos podem ser entendidos como inicializados em tempo de compilação, sem nenhum custo em tempo de execução) .fonte
0
será equivalente a inicializar todos os membros da estrutura com0
embora. Em muitas plataformas, isso será verdade, mas não universalmente.{}
não é válido em C, mas está disponível apenas em C ++.NULL
ponteiro que nem todos eram0
bits: c-faq.com/null/machexamp.html . E então há a possibilidade de a plataforma não estar usando IEEE 754 para representar valores de ponto flutuante, mas usar alguma outra representação que não tenha um valor de todos os0
bits0.0
- mas admito que não conheço tal plataforma.Consulte §6.7.9 Inicialização:
Então, sim, ambos funcionam. Observe que no C99 uma nova forma de inicialização, chamada inicialização designada, também pode ser usada:
fonte