我有一些像这样的代码:
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'
怎么会发生这种情况?我该怎么办呢?
答案 0 :(得分:41)
您不能拥有静态数组,其大小是作为变量
给出的这就是为什么常数应该是#define
d:
#define a 6
这样预处理器会将a
替换为6
,使其成为有效声明。
答案 1 :(得分:9)
简单回答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.
}
现在使用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
设为const
对您无效,但在C++
const
中工作得很好。
答案 2 :(得分:1)
使用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被解释为只读)
请参阅此主题中的解释:
"Initializer element is not constant" error for no reason in Linux GCC, compiling C
答案 3 :(得分:0)
是的,这很烦人:
Future.await[_doSome].then((data){
print(data);
}).timeout(Duration(seconds: 10));
给出错误。我试图摆脱#define x的定义,因为const int是声明常量的更好方法,但是在这种情况下,即使编译器非常了解const int也不是真正的常量。>