仅从限制指针参数声明推断非别名

问题描述 投票:0回答:1

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 条中的文本,

“...如果对象被修改并访问...”

后续示例中也有类似的更改。但对我来说,这似乎改变了语义。

c language-lawyer restrict-qualifier
1个回答
0
投票

示例中存在错误。声明不应说“如果通过指针参数之一访问对象”,而应该说“如果通过指针参数之一访问对象并在函数执行期间修改对象。”

© www.soinside.com 2019 - 2024. All rights reserved.