编译时期的聚合赋值

前端之家收集整理的这篇文章主要介绍了编译时期的聚合赋值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

C++提供的聚合赋值是个非常方便的语法,免去了一堆堆的for。

举个简单的例子:

int a[] = {1,2,3,4,5};

这就是对数组a进行的聚合赋值。数组a的长度是5,在a[0]~a[4]里分别按顺序的存放着1,2,3,4,5.

可是如果你想在编译程序时对这些(指聚合赋值后的变量)进行引用时,可能就会出现问题。

如果有如下代码

1
2
3
4
5
6
const int i[] = { 1,2,3,4 };
float f[i[3]]; //Illegal
struct S { int i,j; };
const S s[] = { { 1,2 },{ 3,4 } };
double d[s[1].j]; // Illegal
int main() {}

看起来我们定义了一个数组i,而且按顺序的初始化为1,2,3,4,5.

语句

就是用i[3]里存的值(4)对数组f的大小进行初始化。

一切看起来像是如此平静。

但是,错误就在这时候发生了,编译器会给出一个错误

“variable-size type declared outside of any function”

为什么呢????

因为编译器在编译时期不对数组i里边的数据进行处理,也就是说,它仅仅知道有i这么一个数组,大小它也知道,但是里边的值却不知道(或者说是不必知道)。

相类似的,语句

也是有同样的错误

但是我们如果对程序略加修改

1
2
3
4
5
6
7
int main() {
const int i[] = { 1,4 } };
double d[s[1].j]; // Illegal
}

此时就能通过编译。

这样的问题,需要打醒十二分精神,要出出错了,还不知道自己错在哪。

原文链接:https://www.f2er.com/javaschema/287844.html

猜你在找的设计模式相关文章