阅读C标准,6.7.3.1" restrict
"的正式定义后,我有以下误解。我想知道以下代码是否会立即导致未定义的行为:
void foo(int *restrict p) {
int *restrict q = p;
}
很明显,q
被赋予了基于另一个受限指针p
的值。不清楚的是,这两个指针是否与同一个块(函数本身)相关联,或者与不同的块(p
与函数本身,q
及其复合语句体)相关联,因为,例如
int *restrict p;
{
int *restrict q = p;
}
不会导致未定义的行为(可以在子块中创建别名指针)。
MSVC++ restrict keyword and local variables中的最佳答案表明int *restrict q = p + 1;
会很好,但是[至少在C标准的情况下]它不正确,因为表达式p + 1
仍然基于p
。
该块的定义见6.7.3.1 p2:
- 如果 [某个指针声明]
醇>D
出现在一个块内,并且没有存储类extern
,让B
表示该块。如果D
出现在函数定义的参数声明列表中,请B
表示关联的块。 [...]
&#34>相关的块"函数体在这个上下文中与函数体相同吗?因为我没有立即找到任何关于术语"相关块"的解释。在本文前面。