我阅读了所有我能想到的所有内容和#34;编译时间常数"在C中,我还不能对以下内容作出解释:
const short testArray[2]={1,2};
//void IndeedConst(void){ testArray[0]=3; } //correctly reports "error: assignment of read-only location 'testArray[0]'"
const short testItem=testArray[0]; //why "error: initializer element is not constant"??
所以编译器抱怨testArray [0]只读/ const,同时它声明testArray [0]不是常量! 我确实回答了自己"显然,解除引用操作符[]在编译时不能正常工作"常量初始化,那么为什么这些行会编译而没有错误?
const short* testItem=&(testArray[1]);
另请注意,我在这里获取数组中第二项的地址。因此"编译时间"恒定初始化可以取消引用没有问题!
对此有何解释?
答案 0 :(得分:4)
对于具有静态存储持续时间的变量,初始化程序必须由常量表达式组成。其中包括:
sizeof
表达式的操作数。它们可能不会引用其他变量的值。[]
和&
等运算符。在这种情况下,由于引用存储在另一个变量中的值,testArray[1]
不是常量表达式,但&testArray[1]
是一个地址常量,是一个有效的常量表达式。
参考:C99标准,第6.6节。