前端之家收集整理的这篇文章主要介绍了
编译时期的聚合赋值,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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@H_403_23@
6 |
const@H_403_23@ int@H_403_23@ i[] =@H_403_23@ { 1@H_403_23@,2@H_403_23@,3@H_403_23@,4@H_403_23@ };
float@H_403_23@ f[i[3@H_403_23@]]; //Illegal@H_403_23@
struct@H_403_23@ S { int@H_403_23@ i,j; };
const@H_403_23@ S s[] =@H_403_23@ { { 1@H_403_23@,2@H_403_23@ },{ 3@H_403_23@,4@H_403_23@ } };
double@H_403_23@ d[s[1@H_403_23@].j]; // Illegal@H_403_23@
int@H_403_23@ main() {}
|
看起来我们定义了一个数组i,而且按顺序的初始化为1,2,3,4,5.
语句
就是用i[3]里存的值(4)对数组f的大小进行初始化。
一切看起来像是如此平静。
但是,错误就在这时候发生了,编译器会给出一个错误:
“variable-size type declared outside of any function”@H_403_23@
为什么呢????
因为编译器在编译时期不对数组i里边的数据进行处理,也就是说,它仅仅知道有i这么一个数组,大小它也知道,但是里边的值却不知道(或者说是不必知道)。
相类似的,语句
也是有同样的错误。
但是我们如果对程序略加修改
1
2
3
4
5@H_403_23@
6
7 |
int@H_403_23@ main() {
const@H_403_23@ int@H_403_23@ i[] =@H_403_23@ { 1@H_403_23@,4@H_403_23@ } };
double@H_403_23@ d[s[1@H_403_23@].j]; // Illegal@H_403_23@
}
|
此时就能通过编译。
这样的问题,需要打醒十二分精神,要出出错了,还不知道自己错在哪。