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

时间:2011-11-03 22:34:28

标签: c++ c arrays

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

给我一​​个错误:

  

错误:在文件范围内修改了'X1'

“X2”也是如此。

但是我记得上面的C ++很好,上面说的很好(我可能会误认为是C ++)。

有人可以为我澄清这个吗?

6 个答案:

答案 0 :(得分:8)

我可以指向C FAQ: I don't understand why I can't use const values in initializers and array dimensions

它基本上说的是num不是真正的常数,它只是只读的。要获得真正的常数,您需要#define num 16

同样在该页面上: C在这方面与C ++不同

答案 1 :(得分:3)

是的,有区别。在C中,const变量仍然不被视为真正的编译时常量(正式情况下,它不允许是constant expression的一部分),因此不允许这样做。但请注意,虽然C不要求编译器允许它,但标准确实允许实现接受其他形式的常量表达式,因此如果它选择它可以自由地接受它。

在C ++中,const变量被视为常量,因此允许它。

有趣的是,当您使用作为函数参数传递的值时,大致相反:

void f(int size) { 
    int array[size];
}

允许在C中,但在C ++中不允许。这是一个variably modified数组;你得到的错误信息基本上是试图告诉你这些只能在函数内部使用。

答案 2 :(得分:0)

不在结构中。你可以在当地范围内完成。

答案 3 :(得分:0)

您必须使用常量值。所以在C中你必须在这方面使用#define。对于C ++,一切都会好的。

请改用:

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

答案 4 :(得分:0)

在C ++中,编译时常量可以用作数组声明中的长度,const变量(只有部分)可以是编译时常量。这就是它在C ++中工作的原因。

然而,

C具有看起来类似的功能,即可变长度数组。这意味着您可以使用任何整数表达式(甚至运行时计算)作为数组长度,但仅限于局部变量。这就是为什么你的编译器抱怨“在文件范围内修改了'X1' ”。

答案 5 :(得分:0)

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

但是您不必使用宏,因为其他人建议使用兼容两者的代码。如果你想用“范围”来做,你可以用枚举常量来做。像

这样的东西
enum { num = 16 };
struct inputs {
  double X1[num];
  double X2[num];
};

对两者都有效,无论你把它放在文件或功能范围内。