【发布时间】:2021-03-28 07:30:40
【问题描述】:
我想知道 const 限定函数指针是否有任何区别,因为我能想到的唯一含义是自动对其参数进行 const 限定,当然不是这样。
我创建了一个小示例文件 (test.c):
typedef void* vop(void*);
vop fn;
const vop cfn;
int main(void){
vop *p_fn = fn;
const vop *cp_fn = fn; // <- gives compiler warning
vop *p_cfn = cfn;
const vop *cp_cfn = cfn;
}
跑了
gcc -Wall -Wno-unused-variable -c test.c
产生以下警告:
警告:初始化使 '__attribute__((const))' 合格的函数指针来自不合格的 [-Wdiscarded-qualifiers]
因此,将“指向 const vop 的指针”分配给“指向 vop 的指针”类型的变量是“可以的”,如果它不是函数指针,则会产生如下内容:
警告:初始化从指针目标类型 [-Wdiscarded-qualifiers] 中丢弃“const”限定符
但现在它会针对相反的情况发出警告。那么问题来了:const 限定的函数指针和非 const 限定的函数指针有什么区别?
注意:cppreference 有以下段落:
如果使用 const 类型限定符(通过使用 typedef)声明函数类型,则行为未定义。
我看到的警告是“未定义行为”的结果,还是本段不适用于这种情况(如果不是,在什么情况下可以应用)?
【问题讨论】:
标签: c function constants typedef