Инициализировать статическую переменную с элементом составного литерала const - PullRequest
0 голосов
/ 08 февраля 2019

Является ли составной литерал const допустимым инициализатором для переменной static?

#define COMPOUND    ((const int [2]){1, 2})

static const int    x   = COMPOUND[0];
/* static const int x   = 1; should be equivalent */

РЕДАКТИРОВАТЬ:

Возможное дублирование в первом комментариине имеет смысла, потому что я спрашиваю явно о const литералах, а не переменных.

1 Ответ

0 голосов
/ 08 февраля 2019

Да, элемент составного литерала может использоваться в качестве инициализатора.

C 2018 6.7.9 4 говорит нам, какими должны быть инициализаторы:

Все выражения винициализатор для объекта, который имеет статическое или потоковое время хранения, должен быть константными выражениями или строковыми литералами.

6.6 сообщает нам, какими могут быть константные выражения.Параграф 3 гласит:

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

В параграфе 4 говорится:

Каждое выражение константы должно преобразовываться в константу, которая находится в диапазоне представимых значений для его типа.

Параграф 7 расширяет этоto:

Допускается больше широты для константных выражений в инициализаторах.Такое константное выражение должно быть или оценивать одно из следующих:

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

Ни один из других абзацев не запрещает использование составных литералов, поэтому ониразрешены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...