Ответ 1
У вас не может быть статический массив, размер которого задается как переменная
Вот почему константы должны быть #define
d:
#define a 6
Таким образом, препроцессор заменит a
на 6
, сделав его допустимым.
У меня есть такой код:
static int a = 6;
static int b = 3;
static int Hello[a][b] =
{
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3}
};
но когда я его компилирую, он говорит об ошибке:
изменено "Hello" в области содержимого
как это могло произойти? и как я могу это исправить?
У вас не может быть статический массив, размер которого задается как переменная
Вот почему константы должны быть #define
d:
#define a 6
Таким образом, препроцессор заменит a
на 6
, сделав его допустимым.
Простой ответ variable modified array at file scope is not possible
.
Подробно:
сделать это время компиляции integral constant expression
, так как длина массива должна быть указана во время компиляции.
вот так:
#define a 6
#define b 3
Или, следуйте стандарту c99. и скомпилировать как для gcc.
gcc -Wall -std=c99 test.c -o test.out
Проблема здесь в массиве переменной длины, при этом длина длины не может быть инициализирована, поэтому вы получаете эту ошибку.
просто
static int a =6;
static int b =3;
void any_func()
{
int Hello [a][b]; // no need of initialization no static array means no file scope.
}
Теперь используйте цикл или любой цикл для заполнения массива.
Для получения дополнительной информации просто DEMO:
#include <stdio.h>
static int a = 6;
int main()
{
int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello it in function
//scope but still error
return 0;
}
[email protected]:~/c# clang -std=c99 vararr.c -o vararr
vararr.c:8:11: error: variable-sized object may not be initialized
int Hello[a]={1,2,3,4,5,6};
^
1 error generated.
Если вы удалите статический файл и выполните инициализацию, он будет генерировать ошибку, как указано выше.
Но если вы сохраните статическую и инициализацию, все равно будет ошибка.
Но если вы удалите инициализацию и сохраните static
, появится следующая ошибка.
error: variable length array declaration not allowed at file scope
static int Hello[a];
^ ~
1 error generated.
Таким образом, объявление массива переменной длины не допускается в области файла, поэтому сделайте его функцией или заблокируйте область внутри любой функции (но помните, что ее функция должна удалять инициализацию)
ПРИМЕЧАНИЕ. Поскольку тег C
помечен так, что сделать a
и b
как const
не поможет, но в C++
const
будет работать нормально.
При использовании CLANG/LLVM выполняется следующее:
static const int a = 6;
static const int b = 3;
static int Hello[a][b] =
{
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3}
};
(Чтобы увидеть его в сгенерированной сборке, нужно использовать Hello, чтобы он не был оптимизирован)
Однако это приведет к возникновению ошибки, если выбран режим C99 (-std = c99), он будет генерировать предупреждение (Wgnu-folding-constant), если выбран -pedantic.
GCC, похоже, не допускает этого (const интерпретируется как только для чтения)
См. объяснение в этой теме: