const int num = 16;
struct inputs{
double X1[num];
double X2[num];
};
给我一个错误:数组大小声明差异对于C和C++
error: variably modified ‘X1’ at file scope
同样是为 'X2' 真。
但我记得上面的C++是好的,以上都是好的(我可能会误认为是C++)。
有人可以为我澄清这一点吗?
const int num = 16;
struct inputs{
double X1[num];
double X2[num];
};
给我一个错误:数组大小声明差异对于C和C++
error: variably modified ‘X1’ at file scope
同样是为 'X2' 真。
但我记得上面的C++是好的,以上都是好的(我可能会误认为是C++)。
有人可以为我澄清这一点吗?
是的,有区别。在C中,const
变量仍然不被视为真正的编译时常量(正式地,它不被允许为constant expression
的一部分),所以这是不允许的。但是,请注意,虽然C不要求编译器允许,但标准确实允许实现接受其他形式的常量表达式,因此如果它选择,它可以自由接受。
在C++中,const
变量被视为常量,因此它是允许的。
有趣的是,大致当使用作为函数参数传递的值的情况正好相反:允许用C
void f(int size) {
int array[size];
}
这是,但不是在C++。这是一个variably modified
阵列;你得到的错误信息基本上是试图告诉你,这些只能在函数内部使用。
我可以指给你一个C FAQ: I don't understand why I can't use const values in initializers and array dimensions。
它基本上说的是num
不是一个真正的常量,它只是只读的。要得到一个真正的常数,你需要一个#define num 16
。
也在同一页面上:C在这方面不像C++。
不在结构中。你可以在本地范围内完成。
你必须使用一个常数值。所以在C中,你必须在这方面使用#define
。对于C++来说,它会很好。
使用此来代替:
#define num 16
struct inputs{
double X1[num];
double X2[num];
};
错误..范围内的'#define'? –
单词的错误选择,意味着方面。 –
这是更好的:) –
在C++中,编译的时间常数可以被用作在数组声明长度和const
变量(仅其中的一些)可以是编译时间常数。这就是为什么它能用C++工作。
但是,C具有类似于可变长度数组的特性。这意味着您可以使用任何整数表达式(即使运行时计算)作为数组长度,但只能用于局部变量。这就是为什么你的编译器抱怨在文件范围处“可变地修改”X1'“。
正如其他人所说的,C和C++对于常量整型表达式是不同的。
但是,您不必像其他人所建议的那样使用宏来使代码适用于两者。如果你想用“范围”来做,你可以用一个枚举常量来实现。像
enum { num = 16 };
struct inputs {
double X1[num];
double X2[num];
};
将适用于这两个,无论你是否把它放在文件或功能范围。
在C中,你可以将一个数组的大小传递给一个函数?学到了 !谢谢! – Rich
@Rich:是的,但只有当你的编译器符合C99(至少在这方面) - 这不包括在C89/90中(虽然它是一个相当常见的扩展,即使是较老的编译器)。 –