【发布时间】:2018-02-22 11:33:40
【问题描述】:
为什么在这种情况下不允许丢弃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。
【问题讨论】:
-
警告说
func允许修改参数。它可能不会现在这样做并不会改变它可以这样做的事实。 -
restrict限定符指示编译器您将仅使用此指针来访问指向的内存,但无法检查您是否真的这样做(在主代码或函数中)。在函数方面,您声明了一个const指针,该指针可以复制到函数内部的不同指针中,允许非限制访问,在这种情况下,编译器在编译函数时无法生成警告。然后在没有显式强制转换的情况下传递指针,这可能是函数内部问题的可能来源,最终不是自愿的.. -
在将
double * restrict发送到仅采用double *的某个函数时,不能使用关于制作副本的相同参数吗?然后再次复制指针并获得非限制访问。