2011-11-03 77 views
5
const int num = 16; 
struct inputs{ 
     double X1[num]; 
     double X2[num]; 
}; 

给我一个错误:数组大小声明差异对于C和C++

error: variably modified ‘X1’ at file scope

同样是为 'X2' 真。

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

有人可以为我澄清这一点吗?

回答

3

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

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

有趣的是,大致当使用作为函数参数传递的值的情况正好相反:允许用C

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

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

+0

在C中,你可以将一个数组的大小传递给一个函数?学到了 !谢谢! – Rich

+0

@Rich:是的,但只有当你的编译器符合C99(至少在这方面) - 这不包括在C89/90中(虽然它是一个相当常见的扩展,即使是较老的编译器)。 –

0

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

+0

即使是C?根据其他答案,C不可能C也许可以吗? – Rich

+3

仅适用于C99,不适用于C89。 –

+0

我相信亚当,因为我不记得确切的标准。他的版本听起来似乎合理。 –

0

你必须使用一个常数值。所以在C中,你必须在这方面使用#define。对于C++来说,它会很好。

使用此来代替:

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

错误..范围内的'#define'? –

+0

单词的错误选择,意味着方面。 –

+0

这是更好的:) –

0

在C++中,编译的时间常数可以被用作在数组声明长度和const变量(仅其中的一些)可以是编译时间常数。这就是为什么它能用C++工作。

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

0

正如其他人所说的,C和C++对于常量整型表达式是不同的。

但是,您不必像其他人所建议的那样使用宏来使代码适用于两者。如果你想用“范围”来做,你可以用一个枚举常量来实现。像

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

将适用于这两个,无论你是否把它放在文件或功能范围。