关于 typedef 函数指针在函数参数中被 const 限定,C 标准有什么规定?例如,假设我有以下类型
typedef int (*Operation)(int a, int b);
我有一堆操作需要两个整数,执行操作,然后返回一个整数。然后我有一个执行实际函数指针调用的函数。
int doOpOnce(const Operation op, int a, int b)
{
return op(a, b);
}
我想保证函数指针在 doOpOnce
调用期间不会改变,我还想向 doOpOnce
的用户证明它实际上会调用该函数给它。这有效吗?之间有什么区别吗:
int doOpOnce(const Operation op, int a, int b)
int doOpOnce(Operation const op, int a, int b)
最后,举个例子。它是用带有标志 -std=c99 -Wall -Wextra -pedantic
的 gcc 4.9.2 编译的,当我尝试更改我的 const 函数指针时它会正确出错。
#include <stdio.h>
typedef int (*Operation)(int a, int b);
int opAdd(int a, int b)
{
return a + b;
}
int opSub(int a, int b)
{
return a - b;
}
int doOpOnce(const Operation op, int a, int b)
{
op = opSub; // error: assignment of read-only parameter 'op'
return op(a, b);
}
int main()
{
printf("%d\n", doOpOnce(opAdd, 10, 20));
return 0;
}
我不想将 const 限定符添加到 Operation
类型定义中,因为我有其他函数可以修改 Operation
指针。我只是想在某些情况下进行更强的打字。
最佳答案
如果参数类型是 Operation,调用者将指针的副本传递给函数,因此函数实际上无法更改指针指向调用者的位置。在此处添加 const 关键字只是实现中的一种防御技术,可防止您重新分配本地副本。从这个意义上讲,您甚至可能不需要 const 限定符来向您的库的客户端发送任何信号。
为了解决你的另一个问题,const 的两个位置具有相同的含义,因此你可以选择你喜欢的一个。
关于带有 typedef 函数指针的 const 限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46284861/