函数指针作为函数参数 - 应该常量吗?[复制]

a function pointer as a function paramter - should one const it? [duplicate]

提问人:Sasha 提问时间:9/15/2023 更新时间:9/15/2023 访问量:48

问:

如果我写如下:

int f(char x, const int (*g) (const char x)) {
    return g(x);
}

第一个是否有效地表达了我认为它所说的,即基本上程序员不能更改函数 g 的代码?所以基本上,在传递函数指针作为参数时,把这些 s 放在一个好的做法是什么?constconst

C 指针 常量函数 参数

评论

0赞 Lundin 9/15/2023
这里的经验法则是永远不要使用没有 typedef 的函数指针。您的示例中没有一个是好的做法,也不是 类型的参数。这些都与常量正确性无关。constint (*const g)(char)
0赞 Sasha 9/16/2023
@Lundin 是的,谢谢,我现在明白了,经过更多的阅读(关于 consts 完全没有用)。无论如何,你的意思是我应该 typedef int (*function_parameter) (char x);然后在函数参数中使用它?
1赞 Lundin 9/17/2023
我不想在 typedef 中隐藏任何指针:“typedef int func_t(char x);' ...int f(char x, func_t* func);

答:

1赞 Ted Lyngmo 9/15/2023 #1

第一个声明返回的不可变 - 但这无关紧要,因为接收器会将其复制到非 - 如果需要的话 - 这正是您的函数所做的。它调用声明返回 a 但返回 .第一个将被忽略。constintconstintf()g()const intf()intconst

它与更改 的代码无关。这在任何情况下都是不允许的。g()

如果你想明确函数指针不会指向里面的另一个函数:f

int f(char x, int (*const g) (const char x))

评论

0赞 Sasha 9/15/2023
哦,谢谢你,我明白了。第一个 const 指的是 int,而不是函数指针参数;因此,如果我说对了,函数指针就无法固定,因为无论如何我们都无法修改它们的取消引用......
1赞 Ted Lyngmo 9/15/2023
@Sasha 几乎正确。您可以创建指针本身,以便无法在函数中更改它。我在答案中添加了这样的声明。const
0赞 tstanisl 9/15/2023
请注意,在推断参数类型时,第二个常量也会被忽略g
0赞 Sasha 9/16/2023
@TedLyngmo 谢谢。虽然,在实践中这样做似乎毫无用处,不是吗?查看声明的“API 用户”应该并不真正关心我是否出于某种原因为了方便而更改了函数中的指针。