C 语言规范 (n3096, 6.7.3.1/8) 给出了以下示例
示例2 以下示例中的函数参数声明
void f(int n, int * restrict p, int * restrict q) { while (n-- > 0) *p++ = *q++; }
断言,在函数的每次执行期间,如果通过其中一个指针访问对象 参数,那么它也不能通过其他方式访问。翻译器可以使此无别名 仅根据参数声明进行推理,无需分析函数体。
译者如何仅根据参数声明来推断出这一点?
例如,请允许我修改此示例,保留参数声明,如下所示。
int sum;
void f(int n, int * restrict p, int * restrict q)
{
while (n-- > 0)
sum += *p++ + *q++;
}
我认为现在允许通过
p
和 q
访问同一个对象,因为该对象不再被修改。 (事实上,这似乎是第 10 节中后续示例 3 的要点。)
示例 5、6 和 7(第 13、14、15 条)进一步加深了我的困惑。解决我的困惑的一种方法是修改第 8 条中的文本,
“...如果对象被修改并访问...”
后续示例中也有类似的更改。但对我来说,这似乎改变了语义。
示例中存在错误。声明不应说“如果通过指针参数之一访问对象”,而应该说“如果通过指针参数之一访问对象并在函数执行期间修改对象。”