В языке C объекты со статической продолжительностью хранения должны быть инициализированы с константными выражениями или с агрегатными инициализаторами, содержащими константные выражения.
«Большой» объект никогда не является константным выражением в C, даже если объект объявлен как const
.
Более того, в языке C термин «константа» относится к буквальным константам (например, 1
, 'a'
, 0xFF
и т. Д.), Элементам перечисления и результатам таких операторов, как sizeof
. Константные объекты (любого типа) не являются константами в терминологии языка C. Их нельзя использовать в инициализаторах объектов со статической продолжительностью хранения независимо от их типа.
Например, это НЕ константа
const int N = 5; /* `N` is not a constant in C */
Вышеуказанное N
будет константой в C ++, но не является константой в C. Итак, если вы попытаетесь сделать
static int j = N; /* ERROR */
вы получите ту же ошибку: попытка инициализировать статический объект с непостоянной величиной.
Это причина того, что в языке C мы преимущественно используем #define
для объявления именованных констант, а также прибегаем к #define
для создания именованных агрегатных инициализаторов.