XC8 v2.10 C99 中的数组索引类型和警告 (752)
Array Index Types & Warning (752) in XC8 v2.10 C99
第一个问题,希望能看懂!
我正在初始化一个指向复合文字的指针,它是一个结构指针数组。
然后我可以像通常使用指针数组一样使用这个指针。
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
- C99 标准和 C 库中的 Link
- 警告级别:-9
- 设备:PIC18F46K20
- 优化:Space(专业版)
This warning seems to be pointing to the line where I access the array members with the index of type size_t. It seems that the type used by the compiler for array index's is not constant, and actually depends on the size of the array.
C 对数组的固有索引类型没有任何意义。允许通过任何整数类型的索引表达式访问数组,但这并不意味着将索引转换为特定的整数类型。
Am I going crazy or have I found some interesting quirk with the optimization?
我认为您发现了编译器的一个怪癖,但不清楚这是否与优化有关。也不清楚该警告是否表明存在任何 善意 风险。但是,从 C 语言的角度来看,我认为您在 C99 或更高版本中单独或一起发布的代码片段没有任何问题。
如果你看一下 XC8 用户手册(我的是第 149 页上的 1.42),它说 int 是 16 位,因此猜测默认 int 是 16 位。
- 在声明末尾添加 ULL
- 与 32 位比较时,使用 0ULL。
第一个问题,希望能看懂!
我正在初始化一个指向复合文字的指针,它是一个结构指针数组。 然后我可以像通常使用指针数组一样使用这个指针。
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
- C99 标准和 C 库中的 Link
- 警告级别:-9
- 设备:PIC18F46K20
- 优化:Space(专业版)
This warning seems to be pointing to the line where I access the array members with the index of type size_t. It seems that the type used by the compiler for array index's is not constant, and actually depends on the size of the array.
C 对数组的固有索引类型没有任何意义。允许通过任何整数类型的索引表达式访问数组,但这并不意味着将索引转换为特定的整数类型。
Am I going crazy or have I found some interesting quirk with the optimization?
我认为您发现了编译器的一个怪癖,但不清楚这是否与优化有关。也不清楚该警告是否表明存在任何 善意 风险。但是,从 C 语言的角度来看,我认为您在 C99 或更高版本中单独或一起发布的代码片段没有任何问题。
如果你看一下 XC8 用户手册(我的是第 149 页上的 1.42),它说 int 是 16 位,因此猜测默认 int 是 16 位。
- 在声明末尾添加 ULL
- 与 32 位比较时,使用 0ULL。