Инициализировать статическую переменную с элементом составного литерала const

Это 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 ответ

Решение

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

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

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

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

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

Параграф 4 гласит:

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

Пункт 7 расширяет это до:

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

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

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

Другие вопросы по тегам