C中文件范围的可变修改数组

时间:2012-11-30 13:10:01

标签: c arrays static

我有一些像这样的代码:

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'

怎么会发生这种情况?我该怎么办呢?

4 个答案:

答案 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已标记,因此将ab设为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也不是真正的常量。