如何声明带restrict限定符的函数指针参数?
为什么函数指针参数不能用
restrict修饰? 咱们先从你给出的例子入手,一步步理清楚原因:
先看合法的写法
- 基础版函数指针参数:
这是标准的函数指针参数声明,完全符合C语法,没毛病。int bar(int (*a)()) { } - 加
const限定的版本:
这里的int bar(int (*const a)()) { }const是修饰指针变量a本身,意思是在bar函数内部,你不能修改a的指向(比如不能让它指向另一个函数)。const的作用是限定变量的可修改性,不管这个变量是普通指针还是函数指针,所以这个写法合法。
为什么加restrict会报错?
你尝试的写法:
int bar(int (*restrict a)()) { }
在gcc 7.3.0下报error: invalid use of ‘restrict’,核心原因是**restrict的适用范围被C标准严格限定了**。
restrict是C99引入的限定符,它的设计目的是给编译器提供优化线索:告诉编译器,这个指针是指向某块内存区域的唯一访问路径(在特定作用域内),没有其他指针会去读写这块区域。但这里有个关键前提:restrict只能用于指向对象类型(object type)的指针。
而函数类型不属于对象类型——函数指针指向的是代码段里的函数入口,不是可修改的内存数据对象(标准C里你没法直接修改函数的内容)。restrict是为优化内存数据访问而生的,它管不到函数指针这种指向代码的情况,所以编译器直接判定这个用法无效。
补充:什么时候函数指针相关的restrict是合法的?
如果你声明的是指向函数指针的指针,这时候restrict就可以用了,比如:
int bar(int (**restrict a)()) { }
这里restrict修饰的是外层的指针a,它指向的是一个可修改的函数指针变量(属于对象类型),符合restrict的适用规则,编译器就不会报错了。
内容的提问来源于stack exchange,提问作者Todd Freed
相关产品推荐
相关产品推荐

