Что они в основном означают, так это то, что в C запрещено использовать квалифицированную переменную const
для инициализации другой переменной или определения размера массива с ней в глобальной области видимости, например:
const int SIZE = 5;
int a = SIZE; // This is not allowed.
int b[SIZE]; // This is also not allowed.
int main(void)
{
...
}
Это потому, что переменные и массивы в глобальной области видимости должны быть определены во время времени компиляции . const
квалифицированная переменная по-прежнему является переменной, и значения переменных вычисляются / оцениваются в время выполнения .
A макро константа , которая является «постоянной времени компиляции», может быть использована для этого, например, например:
#define SIZE 15
int a[SIZE]; // This is ok.
int b = SIZE; // This is ok, too.
Я также надеваю не очень хорошо понимаю разницу между const
переменной и константным выражением. Все const
переменные являются константными выражениями, верно?
Нет.
Цитата из ИСО: IEC 9899/2018 (C18), раздел 6.6 / 2:
" Постоянное выражение может быть оценено во время перевода довольно чем во время выполнения, и, соответственно, может использоваться в любом месте, где константа может быть."
Выражение константы - это буквальное выражение, которое всегда оценивается одним и тем же значением - вычисленное значение постоянная. Поэтому его можно оценить во время компиляции.
Fe:
5 + 4
всегда равно 9 и поэтому может быть оценено во время компиляции.
В то время как переменная const
:
const int SIZE = 5;
или
(const int SIZE 5;)
5 + 9 + SIZE;
не является константным выражением, поскольку оно подразумевает переменную. Хотя переменная SIZE
определяется как const
(что означает, что она не может быть изменена после инициализации), она не является константным выражением, поскольку переменная, не имеет значения, вычисляется ли она const
или нет, / вычисляется во время выполнения.
A const
квалифицированная переменная не является и не может быть частью константного выражения.