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

标签 c keyword

我想知道是否可以将 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/

相关文章:

c++ - 使用大型库是否会固有地使代码变慢?

c - 确保只将指针传递给可变参数函数

c# - 什么是虚拟方法?

powershell - 使用 'from' 和 'data' 关键字的示例?

php - 无法创建根据相关关键字搜索 1+ 个数据库的函数

kotlin - typeof关键字是什么

c++ - 结束字符 `\0`算一个字符还是两个字符?

c - 为什么下面的代码会给出这个输出?

c - 为什么字符串的字节大小比长度长?

java - 未初始化的最终局部变量与未初始化的最终实例变量