int q = {1,2}; lista de inicialización peculiar

Encontré la siguiente inicialización, se ve que VS2012 muestra un error quejándose de demasiados inicializadores. en GCC parece devolver el primer elemento como el valor.

¿Por qué se admite esta inicialización peculiar en GCC?

#include  int main() { int q = {1,2}; char c = {'s','t','\0'}; /* c is 's' */ printf("%d\n",q); /* prints 1*/ } 

C11: 6.7.9 Inicialización (p11):

El inicializador para un escalar será una expresión única, opcionalmente encerrada entre llaves .

Por lo tanto, esto está permitido

 int q = {1}; 

Puede encerrar el inicializador para objetos escalares entre llaves ( {} ). Tenga en cuenta el verbo se utiliza aquí. La norma dice:

5.1.1.3 Diagnóstico (P1):

Una implementación conforme producirá al menos un mensaje de diagnóstico (identificado de una manera definida por la implementación) si una unidad de traducción de preprocesamiento o una unidad de traducción contiene una violación de cualquier regla o restricción de syntax, incluso si el comportamiento también se especifica explícitamente como no definido o implementación definido

Entonces, depende del comstackdor cómo maneja

 int q = {1,2}; 

Comstackdo en GCC 4.8.1 con flags -pedantic -Wall -Wextra y generó una advertencia

 [Warning] excess elements in scalar initializer [enabled by default] 

Ahora la pregunta es: ¿Qué pasó con los inicializadores restantes? Es un bicho


Nota: C11: 6.5.17 (p3) dice que el operador de coma no puede aparecer en contextos donde se usa una coma para separar elementos en una lista (como argumentos a funciones o listas de inicializadores).

No confunda el , en {1,2} con el operador de coma . Como señaló Keith Thompson , la expresión en inicializador debe ser una expresión de asignación y no debe contener un operador de coma en el nivel superior. Eso significa que se puede usar dentro de una expresión entre paréntesis o dentro de la segunda expresión de un operador condicional en tales contextos. En la llamada de función

 f(a, (t=3, t+2), c) 

La función tiene tres argumentos, el segundo de los cuales tiene el valor 5 .