gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:08:09 35 4
gpt4 key购买 nike

我想知道是否可以将 restrict 关键字仅包含在函数定义中,而不是像这样的函数声明中:

void foo(char *bar);

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

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

最佳答案

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

… the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type.

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

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

… (In the determination of type compatibility and of a composite type, … each parameter declared with qualified type is taken as having the unqualified version of its declared type.)

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

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

关于 `restrict` 关键字只能在函数定义中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66429492/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com