gpt4 book ai didi

c - 传递 'func' 的参数 1 会丢弃指针目标类型中的 'restrict' 限定符

转载 作者:行者123 更新时间:2023-12-03 03:07:38 25 4
gpt4 key购买 nike

为什么在这种情况下不允许丢弃 restrict 限定符?

void func(double * const *q) {
q[0][0] = 10.0;
}

int main(void) {
double a = 5.0;
double * restrict p = &a;
double * restrict const *q = &p;

// GCC: warning: passing argument 1 of 'func' discards 'restrict' qualifier
// from pointer target type [-Werror=discarded-qualifiers]
func(q);

return 0;
}

该错误似乎不直观,因为限制指针可以转换为非限制指针,并且这里使用 const 我确保 func 无法替换 p 带有非限制指针。

最佳答案

所有类型限定符的一般规则是您可以安全且隐式地从指针类型转换为限定指针类型。这是由 6.3.2.3 以及简单赋值规则 6.5.16.1(在参数传递期间应用)保证的。这同样适用于所有限定符:constvolatilerestrict_Atomic

这并不意味着您可以采取相反的方式。您永远不能隐式删除限定符,您必须使用显式强制转换。当您这样做时,您会调用实现定义的行为。

在这种情况下,转换是完全安全的:func((double*const *)q);

值得注意的是,restrict 在用于函数参数并且您从另一个翻译单元调用这些函数时最有意义。在局部作用域内使用 restrict 可能意义不大,因为编译器可以轻松推断表达式中涉及的变量是否指向不同地址或相同地址。

总的来说,它是程序员和编译器之间的“契约”,程序员 promise 不通过任何其他变量访问所指向的数据。然而,程序员可以通过放弃限制来轻松打破这个契约,然后任何事情都可能发生。

关于c - 传递 'func' 的参数 1 会丢弃指针目标类型中的 'restrict' 限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926403/

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