web-dev-qa-db-pt.com

Uma lista vazia do inicializador é um código C válido?

É 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;
29
Marcus Ahlberg

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.

37
interjay

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.

1
FUNNYDMAN