繁体   English   中英

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

[英]variably modified array at file scope in C

我有一些这样的代码:

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

这样预处理器将用6替换a ,使其有效声明。

variable modified array at file scope is not possible简单答案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可以正常工作。

使用 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 被解释为只读)

请参阅此线程中的说明:

Linux GCC中无缘无故的“初始化器元素不是常量”错误,编译C

是的,这很烦人:

const int len = 10;

int stuff[len];

给出错误。 我试图避免使用 #define x,因为 const int 是一种更好的声明常量的方式,但是在这些情况下,const int 不是真正的常量,即使编译器很清楚它是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM