É comum usar {0}
para inicializar um struct
ou um array
, mas considere o caso quando o primeiro campo não é um tipo escalar. Se o primeiro campo de struct Person
for outro struct
ou array, essa linha resultará em um erro (error: missing braces around initializer
).
struct Person person = {0};
Pelo menos o GCC me permite usar uma lista inicializadora vazia para realizar a mesma coisa
struct Person person = {};
Mas este código C é válido?
Além disso: esta linha garante o mesmo comportamento, ou seja, um struct
inicializado com zero?
struct Person person;
Não, uma lista de inicializadores vazia não é permitida. Isso também pode ser mostrado pelo GCC ao compilar com -std=c99 -pedantic
:
a.c:4: warning: ISO C forbids empty initializer braces
A razão é a maneira como a gramática é definida no §6.7.9 do 2011 ISO C Standard :
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer
De acordo com essa definição, uma lista de inicializadores deve conter pelo menos um inicializador.
De acordo com o padrão C99, a criação de matrizes com uma lista de inicializadores vazia é proibida. Em uma resposta anterior, você pode ver que a gramática não descreve este caso.
Mas o que acontece se você declarar um array sem inicialização? Bem, isso depende do compilador que você usa. Vamos dar uma olhada neste exemplo simples: int arr[5] = {}
.
GCC
Por padrão, gcc
não produz nenhum avisos/errosquando você tenta compilar este código. Nem mesmo -Wall
, mas -Wpedantic
faz.
warning: ISO C forbids empty initializer braces
Mas de qualquer maneira gcc
preenche membros de uma matriz com 0 exatamente como se você especificasse int arr[5] = {0}
veja Assembly output godbolt .
CLANG
Mas o padrão não mostra avisos sobre este caso, mas com a opção -Wgnu-empty-initializer
:
warning: use of GNU empty initializer extension
Clang gera código Assembly diferente godbolt mas se comporta da mesma forma.