gpt4 book ai didi

C 中的常量数组类型,标准中的缺陷?

转载 作者:太空狗 更新时间:2023-10-29 16:34:22 27 4
gpt4 key购买 nike

C99 规范的第 6.7.3.8 段

If the specification of an array type includes any type qualifiers, the element type is so-qualified, not the array type. If the specification of a function type includes any type qualifiers, the behavior is undefined.

rationale (逻辑页 87,物理页 94),给出了将平面指针转换为(可变长度)数组指针的示例。

void g(double *ap, int n)
{
double (*a)[n] = (double (*)[n]) ap;
/* ... */ a[1][2] /* ... */
}

当然,如果数组 ap 在函数中没有被修改,它应该被标记为 const,但是在 cast in 中

void g(const double *ap, int n)
{
const double (*a)[n] = (const double (*)[n]) ap;
/* ... */
}

不保留 const 限定符,因为(根据 6.7.3.8)它适用于目标的元素而不是目标本身,它具有数组类型 double[n]。这意味着如果给出适当的标志(-Wcast-qual 用于 GCC),编译器将正确地提示。在 C 中无法表示 const 数组类型,但这种转换非常有用且“正确”。 -Wcast-qual 标志对于识别数组参数的滥用很有用,但误报阻碍了它的使用。请注意,与 ap[i*n+j] 相比,索引 a[i][j] 更具可读性,并且对于许多编译器而言,生成的机器代码更好,因为前者允许在较少分析的情况下将一些整数算法提升到内部循环之外。

编译器是否应该将此视为一种特殊情况,有效地将限定符从元素提升到数组类型,以确定给定的转换是否删除限定符,或者是否应该修改规范?没有为数组类型定义赋值,因此与 6.7.3.8 相比,限定符始终应用于数组类型而不仅仅是元素是否会受到伤害?

最佳答案

这是一个已知问题,过去 10 年在 comp.std.c 上讨论过多次。最重要的是,您提出的具体案例目前在标准 C 中是不合法的;您需要删除限定符或避免使用指向数组的指针来引用数组中的限定元素。

如果您认为自己有解决问题的好主意,可以将其发布到news:comp.std.c 进行讨论。如果其他人同意这是一个好主意,您或其他人可以提交缺陷报告以更改行为(有几位委员会成员经常访问 comp.std.c,因此可能审查 DR 的人的反馈会在提交之前很有用)。我认为您关于让限定符影响数组本身的提议可能存在一些问题,但我必须再考虑一下。

关于C 中的常量数组类型,标准中的缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/305293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com