const int num = 16;
struct inputs{
double X1[num];
double X2[num];
};
给我一个错误:
错误:在文件范围内修改了'X1'
“X2”也是如此。
但是我记得上面的C ++很好,上面说的很好(我可能会误认为是C ++)。
有人可以为我澄清这个吗?
答案 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];
};
对两者都有效,无论你把它放在文件或功能范围内。