Я нашел интересный факт, и я не понял, как это работает.
Следующий фрагмент кода просто отлично работает.Размер массива с константой в C
#include <stdio.h>
int main(){
const int size = 10;
int sampleArray[size];
typedef char String [size];
return 0;
}
Затем я попытался использовать только и только постоянную переменную с глобальным охватом, и все равно прекрасно.
#include <stdio.h>
const int size = 10;
int main(){
int sampleArray[size];
typedef char String [size];
return 0;
}
Но, если я меняю масштаб массивов на глобальные, а также, я получил следующее:
error: variably modified ‘sampleArray’ at file scope
#include <stdio.h>
const int size = 10;
int sampleArray[size];
typedef char String [size];
int main(){
return 0;
}
И я не понимаю! Если бы я заменил переменную const для ex. до #define
все будет хорошо.
Я знаю, что переменная #define предварительно обработана, и насколько я знаю, константная переменная доступна только для чтения. Но что делает глобальный охват в конце концов?
Я не понимаю, в чем проблема с третьим куском кода, если второй - все в порядке.
Некоторые детали: C имеет объекты 'const', но не _constant_. Хотя 'const', кажется, подразумевает _constant_, объект' const' не _constant_, но скорее как «этот объект не должен меняться, но если попытка изменения - кто знает, что может произойти?» В C истинным _constant_ является код типа '42', который является константой _integer_ с типом' int'. Таким образом, 'const int size = 10;' не является переменной _constant_. – chux
Массив не имеет постоянного размера, но является массивом переменной длины. – Olaf
Как они сказали, C имеет объекты 'const', которые на самом деле являются переменными * только для чтения *. Ср C++, который имеет истинные объекты 'const', которые на самом деле являются константами компиляции *. –