Почему Clang решил разрешить назначенные инициализаторы в C ++? - PullRequest
0 голосов
/ 31 января 2019

Я думал, что назначенные инициализаторы были прекращены в C ++ и работали только в C. Однако я наткнулся на простой пример, который компилировался и прекрасно работал с clang ++.

int main()
{
    int a[6] = { [4] = 29, [2] = 15 };
}

g ++: https://rextester.com/AXIZ79197 (ошибка)

clang ++: https://rextester.com/UYVHHP56966 (работает)

vc ++: https://rextester.com/UCBEU10658 (Ошибка)

Не удалось скомпилировать и g ++, и vc ++, тогда как clang ++ работал просто отлично.Также стоит упомянуть, что g ++ и vc ++ выдавали разные сообщения об ошибках.vc ++ перепутал обозначенные инициализаторы с лямбда-выражениями.Я думаю, я мог бы обвинить в этом тот факт, что g ++ является более старым компилятором, но я не уверен, что tbh.

Вопросы:

  1. Почему clangрешил разрешить назначенные инициализаторы, когда g ++ и vc ++ не сделали?
  2. Это просто ошибка компилятора или есть другая причина для этого?

1 Ответ

0 голосов
/ 31 января 2019

При компиляции с -pedantic генерируются следующие предупреждения:

source_file.cpp:3:18: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };
                 ^~~~~~~~
source_file.cpp:3:28: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };

Понятно, что clang++ по умолчанию включает c99-extensions.

Это не ошибка, так как компиляторы могут предоставить дополнительную функцию.clang++ разработчики просто решили оставить его включенным.Лучше использовать -pedantic, если нам не нужны эти функции.

Интересно, что при поиске соответствующей информации я наткнулся на поддержку C ++ в Clang , где "Назначенные инициализаторы"перечислены как частично поддерживаемые через расширение для будущих предложений:

экспериментальная поддержка некоторых предлагаемых функций стандарта C ++ после C ++ 17, условно названного C ++ 2a

Это является точным предложением для предстоящего стандарта.Так что в будущем C ++ могут быть назначены инициализаторы.

...