`restrict`关键字只能在函数定义中使用吗?

我想知道是否可以restrict只在函数定义中而不是在函数声明中包含关键字,如下所示:

void foo(char *bar);

void foo(char * restrict bar)
{
    // do something
}

由于foo只接受一个参数,因此任何指针别名都必须在foo. 调用函数的人不需要知道restrict修饰符。只在函数声明中省略关键字是否可以,就像 with 一样const

回答

您可以restrict在函数声明中使用on 参数,无论它们是否是定义,因为它是 C 语法允许的,并且没有任何规则反对它。但是,它们对不是定义的声明中的编译器没有影响。这是因为 6.5.2.2 7 说在将参数传递给具有原型的函数时会删除限定符:

... 参数被隐式转换,就像通过赋值一样,转换为相应参数的类型,将每个参数的类型视为其声明类型的非限定版本。

因此,如果函数声明具有类型为 的参数,则int * restrict a您传递的任何参数都将转换为非限定类型int *

此外,即使更改了参数的限定符,两个其他相同的函数声明也是兼容的,因为 C 2018 6.7.6.3 15 说:

……(在确定类型兼容性和复合类型时,……使用限定类型声明的每个参数都被视为具有其声明类型的非限定版本。)

但是,这仅适用于参数本身。该参数不受restrict限定它的 a 的影响。但它可以指向受限制限定的指针。例如,void foo(void * restrict *a);void foo(void **a);声明不同的函数类型。

尽管声明中参数的限定符对编译器没有影响,但它们可以向人类发出信号,表明参数应该符合限制。在函数定义中,参数是限制限定的,任何调用该函数的人都应该尊重这一点。


以上是`restrict`关键字只能在函数定义中使用吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>