XC8 v2.10 C99中的数组索引类型和警告(752)

问题描述 投票:-1回答:1

第一个问题,所以我希望它可以理解!

我正在初始化一个指向复合文字的指针,它是一个结构指针数组。然后,可以像通常使用指针数组一样使用此指针。

typedef struct
{
    uint32_t test1;
    uint32_t test2;
    uint32_t test3;
    uint32_t test4;
    uint32_t test5;
    uint32_t test6;
    uint32_t test7;
    uint32_t test8;
    uint32_t test9;
    uint32_t test10;
    uint32_t test11;
} TestStruct;

TestStruct* TestStructArray = (TestStruct[])
{
    {
        .test1 = 69,
    },
    {
        .test1 = 69,
    },
    {
        .test1 = 0,
    },
};

[稍后当我尝试遍历此数组时,我将size_t类型的变量用于循环计数器,并使用[]数组符号访问数组的成员。

void main(void)
{
    size_t ArrIdx = 0U;
    while(TestStructArray[ArrIdx].test1 != 0U) \\\\\ <-- warning: (752) conversion to shorter data type
    {
        LocalTestFunction();
        ArrIdx++;
    }
}

当数组大小降至某种大小阈值以下时,编译器会发出以下警告:(752)转换为较短的数据类型。将更多成员添加到该结构,或将更多成员添加到该结构的数组将删除警告。在此示例中,初始化数组的另一个成员将消除编译器错误。

此警告似乎指向我以size_t类型的索引访问数组成员的行。看来编译器用于数组索引的类型不是恒定的,实际上取决于数组的大小。这使得防止截断或未使用的内存非常困难。

我已经在一个全新的项目中编译了此测试代码,并且行为仍然存在。

我会发疯还是通过优化找到了一些有趣的怪癖?

我的构建环境如下:

  • MPLAB X v5.35
  • XC8 v2.10
  • C库中的C99标准和链接
  • 警告等级:-9
  • 设备:PIC18F46K20
  • 优化:空间(PRO)

Example Project

c pointers pic xc8 compound-literals
1个回答
0
投票

此警告似乎指向我以size_t类型的索引访问数组成员的行。似乎编译器用于数组索引的类型不是恒定的,实际上取决于数组的大小。

C对数组的固有索引类型没有任何意义。允许通过任何整数类型的索引表达式访问数组,但这并不意味着将索引转换为特定的整数类型。

我会发疯还是通过优化找到了一些有趣的怪癖?

我认为您已经发现了编译器的一个怪癖,但尚不清楚这是否与优化有关。也不清楚警告是否预示着任何“善意”风险。但是,从C语言的角度来看,您在C99或更高版本中发布的代码片段(无论是单独发布还是一起发布)都没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.