Подтвердить что ты не робот

Int q = {1,2}; уникальный список инициализации

Я столкнулся с следующей инициализацией, видно, что VS2012  показывает ошибку, жалующуюся на слишком много инициализаторов. в GCC, похоже,  верните первый элемент в качестве значения.

почему эта уникальная инициализация поддерживается в GCC?

#include <stdio.h>

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

Ответ 1

C11: 6.7.9 Инициализация (p11):

Инициализатор для скаляра должен быть единственным выражением , необязательно заключенным в фигурные скобки.

Следовательно, это разрешено

int q = {1};   

Вы можете заключить инициализатор для скалярных объектов в фигурные скобки ({}). Обратите внимание, что глагол используется здесь. В стандарте говорится:

5.1.1.3 Диагностика (P1):

Соответствующая реализация должна выдавать, по меньшей мере, одно диагностическое сообщение (идентифицированное определенным образом), если блок трансляции или блок перевода содержит нарушение любого синтаксического правила или ограничения, даже если поведение также явно указано как undefined или определенный реализацией

Итак, это зависит от компилятора, как он обрабатывает

int q = {1,2}; 

Скомпилирован на GCC 4.8.1 с флагами -pedantic -Wall -Wextra, и он поднял предупреждение

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

Теперь возникает вопрос: Что происходит с оставшимися инициализаторами? Это bug.


Примечание.. C11: 6.5.17 (p3) говорит, что оператор запятой не может появляться в контекстах, где запятая используется для разделения элементов в списке (например, аргументы для функций или списки инициализаторов).

Не путайте , в {1,2} с оператором запятой. В качестве Keith Thompson указывалось, что выражение в инициализаторе является выражением присваивания и не должно содержать запятой на верхнем уровне. Это означает, что он может использоваться в выражении в скобках или во втором выражении условного оператора в таких контекстах. В вызове функции

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

функция имеет три аргумента, вторая из которых имеет значение 5.