我有一些这样的代码:
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}
};
但是当我编译它时,它说错误:
在文件范围内可变地修改“你好”
怎么会这样?我该如何解决?
您不能拥有大小作为变量给出的静态数组
这就是为什么常量应该是#define
d:
#define a 6
这样预处理器将替换a
为6
,使其成为有效声明。
简单的回答variable modified array at file scope is not possible
。
详细的 :
使它成为 compile time 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.
}
现在使用 for 循环或任何循环来填充数组。
更多信息只是一个演示:
#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's in function
//scope but still error
return 0;
}
root@Omkant:~/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
asconst
不会帮助你,但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),这将产生一个错误,如果选择了 -pedantic,它只会产生一个警告(Wgnu-folding-constant)。
GCC 似乎不允许这样做(const 被解释为只读)
请参阅此线程中的说明:
是的,这很烦人:
const int len = 10;
int stuff[len];
给出错误。我试图避免使用#define x,因为 const int 是一种更好的声明常量的方法,但是在这些情况下 const int 不是真正的常量,即使编译器完全知道它是。