Инициализировать статическую переменную с элементом составного литерала 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 расширяет это до:
Допускается большая широта для константных выражений в инициализаторах. Такое постоянное выражение должно быть или оценивать одно из следующего:
- выражение арифметической константы,
- константа нулевого указателя,
- адресная константа, или
- адресная константа для полного типа объекта плюс или минус целочисленное константное выражение.
Ни один из других параграфов не запрещает использование составных литералов, поэтому они разрешены.