我正在尝试编译我的C89代码,其中包括一个指向各种其他数组中位置的指针的数组。我一直得到ERROR (207) Aggregate or union objects may be initialized with constant expressions only
,可能是因为我在初始化时如何定义它,但是除了一次定义一个索引之外,我实际上没有更好的方法,我希望避免。我已经尝试了所有可以想到的方法,是否有任何方法可以一次定义一行?
uint8_t * keyPtrs[] = {
towers,
towers,
*(towers + 1),
*(towers + 1),
*(towers + 2),
*(towers + 2),
allianceStack
};
答案 0 :(得分:2)
在C89中,数组的初始化程序必须在编译时可计算。 See here以获得更详细的定义。
在语言标准的更高版本中,对自动数组放宽了此要求(对于静态数组则放宽了此要求)。
您将不得不使用赋值语句,否则,将填充直到运行时才知道的值。
答案 1 :(得分:1)
如果该数组应该标识静态数组towers
中的元素,则正确的语法应为:
uint8_t * keyPtrs[] = {
towers,
towers,
towers + 1,
towers + 1,
towers + 2,
towers + 2,
allianceStack
};
如果towers
和allianceStack
都是具有静态持续时间的数组对象,则该数组中使用的地址应该是静态可计算的。可能有一些针对晦涩的链接器的编译器可能不支持(ptrConst+intConst)
表达式的静态计算,但是您在这里的问题几乎可以肯定是不正确的星号。