C中const限定函数的性质

C中const限定函数的性质,c,function,constants,typedef,C,Function,Constants,Typedef,我想知道const限定函数指针是否有什么不同,因为我能想到的唯一含义是auto const限定其参数,当然不是这样 我创建了一个小示例文件(test.c): typedef void*vop(void*); vop-fn; const vop cfn; 内部主(空){ vop*p_fn=fn; 常数vop*cp_fn=fn;// 常量限定的函数指针与非常量限定的函数指针之间有什么区别 const具有通常的含义-一个可以修改,const一个不能修改。例如: void something(); vo

我想知道const限定函数指针是否有什么不同,因为我能想到的唯一含义是auto const限定其参数,当然不是这样

我创建了一个小示例文件(test.c):

typedef void*vop(void*);
vop-fn;
const vop cfn;
内部主(空){
vop*p_fn=fn;
常数vop*cp_fn=fn;//
常量限定的函数指针与非常量限定的函数指针之间有什么区别

const
具有通常的含义-一个可以修改,
const
一个不能修改。例如:

void something();
void something_else();
int main() {
    void (*normal_pointer)() = something;
    normal_pointer = something_else; // all fine

    void (*const const_qualified_pointer)() = something;
    const_qualified_pointer = something_else; // error

    // for fun, let's aad typedef examples
    // similar with a typedef, if you want to
    typedef void functype();
    functype *pnt = something;
    pnt = something_else; // all fine

    functype *const cpnt = something;
    cpnt = something_else; // error

    // note that if typedef is already a pointer... then it's already a pointer
    typedef void (*functypepnt)();
    functypepnt pnt2 = something;
    pnt2 = something_else; // all fine

    const functypepnt cpnt2 = something;
    cpnt2 = something_else; // error
}
我看到的警告是“未定义的行为”的结果,还是本段不适用于本案(如果不是,在什么情况下可以适用)

是。
vop
是函数类型。
const vop
是未定义的行为。
gcc
发出警告并忽略限定符

您可能希望
const
-改为限定指针本身,而不是指向的类型:

vop *const cp_cfn = fn;

函数类型上不能有任何类型限定符,包括
const
。这样做会影响函数类型

根据本手册第6.7.3p9节:

如果数组类型的规范包含任何类型限定符,则元素类型是如此限定的,而不是数组类型。如果函数类型的规范包含任何类型限定符,则行为是未定义的。

这声明了一个
const
函数类型:

const vop cfn;
const vop *cp_fn;
这声明了一个指向
const
函数类型的指针:

const vop cfn;
const vop *cp_fn;

这两个问题都违反了6.7.3p9。

谢谢你的回答,但实际上我只是对“
const
放在星号前面的情况感到好奇。问题标题可能有点误导。我是否应该更改它?对于那些可能无意中发现这个问题并真正想知道答案的人来说,这个答案将是一个很好的参考“常数指针”。