【问题标题】:Can't compile C89 with array of pointers无法使用指针数组编译 C89
【发布时间】:2019-08-02 02:50:05
【问题描述】:

我正在尝试编译我的 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
};

【问题讨论】:

  • 这在 C89 中是不允许的,您必须定义数组,然后使用赋值语句。事实上,任何版本的语言都不允许使用这个特定的初始化程序,因为towers 和*(towers + 1) 不能都转换为uint8_t *。也许你的意思是*towers 用于前两个条目
  • 我认为你不需要塔上的星号,因为它是一个数组(如果不清楚,抱歉)
  • 好吧 towers 和 *towers 是不同的东西。如果是数组,那么一个是数组,另一个是数组的第一个元素
  • 您可能会想到 towers 和 &towers 具有相同的值,这是不同的事情,但即使那样它们也不能互换。
  • 显示towers、Help Center > Asking的定义会改进问题

标签: c arrays pointers c89


【解决方案1】:

在 C89 中,数组的初始值设定项必须在编译时可计算。 See here 以获得更详细的定义。

在以后的语言标准版本中,自动数组放宽了这一要求(但静态数组仍然存在)。

您将不得不使用赋值语句或其他方式来填充直到运行时才知道的值。

【讨论】:

    【解决方案2】:

    如果该数组应该识别静态数组towers 中的元素,那么正确的语法应该是:

    uint8_t * keyPtrs[] = {
        towers,
        towers,
        towers + 1,
        towers + 1,
        towers + 2,
        towers + 2,
        allianceStack
    };
    

    如果towers 和allianceStack 都是具有静态持续时间的数组对象,则此类数组中使用的地址应该是静态可计算的。一些针对模糊链接器的编译器可能无法支持 (ptrConst+intConst) 表达式的静态计算,但您的问题几乎可以肯定是星号不正确。

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多