C和C++中数组大小声明的差异

5
const int num = 16;
struct inputs{
       double X1[num];
       double X2[num];
};

出现错误:

错误:文件作用域中有可变长度的‘X1’

'X2'也是同样的情况。

但我记得这在C++中是可以的(我可能对C++有所误解)。

有人能为我澄清一下吗?

6个回答

8

3
是的,它们有区别。在C语言中,const变量仍不被视为真正的编译时常量(官方上来说,它不允许作为constant expression的一部分),因此这是不允许的。但请注意,尽管C语言不要求编译器允许它,标准确实允许实现接受其他形式的常量表达式,所以如果愿意,可以自由接受它。
在C++中,const变量被视为常量,因此允许这样做。
有趣的是,当您使用作为函数参数传递的值时,情况大致相反:
void f(int size) { 
    int array[size];
}

C语言中允许使用这种方式,但C++不允许。这是一个“可变修改”的数组;你得到的错误信息基本上是在告诉你这些只允许在函数内部使用。


在C语言中,你可以将数组的大小传递到一个函数中吗?学会了!谢谢! - Rich
@Rich:是的,但只有在您的编译器符合C99标准(至少在这方面)时才可以——这不包括在C89/90中(尽管即使在旧编译器中,这也是一个相当常见的扩展)。 - Jerry Coffin

0

你必须使用一个常量值。因此,在C语言中,你需要使用一个 #define。在C++中使用这样做是可以的。

请使用下面这个:

#define num 16
struct inputs{
  double X1[num];
  double X2[num];
};

选择词汇不当,本意是“关于”。 - Morten Kristensen

0

正如其他人所说,C和C ++在常量整数表达式方面是不同的。

但是,您不必像其他人建议的那样使用宏来编写适用于两者的代码。如果您想要通过“范围”来实现它,可以使用枚举常量来实现。类似于以下内容:

enum { num = 16 };
struct inputs {
  double X1[num];
  double X2[num];
};

无论您将其放在文件或函数范围内,它都可以正常工作。


0

不在结构体中。你可以在本地范围内做到这一点。


即使对于C语言也是这样吗?根据其他答案,对于C语言不可能实现。或许对于C++可以? - Rich
我会相信Adam,因为我不记得确切的标准。他的版本听起来很有道理。 - Michael Krelin - hacker

0
在C++中,编译时常量可以用作数组声明中的长度,而const变量(只有其中一些)可以是编译时常量。这就是为什么它在C++中可以工作的原因。
然而,在C中,有一个看起来类似的特性,即可变长度数组。这意味着您可以使用任何整数表达式(甚至是运行时计算的表达式)作为数组长度,但仅适用于局部变量。这就是为什么您的编译器会抱怨“在文件范围内修改‘X1’大小不定”的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接