【发布时间】:2017-09-18 17:13:13
【问题描述】:
关于 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 typedef,因为我还有其他可以修改 Operation 指针的函数。我只是想在某些情况下更强大的打字。
【问题讨论】:
-
很高兴拥有但没有它你可能会改变什么?来电者不关心...
-
请一次一个问题?
-
那么,你的 C 书怎么说?什么不清楚?你的编译器是怎么说的?您使用
typedef的事实与您的问题有什么关系?尽管它的名字,它确实不“定义”一个新类型!永远不要typedef指针!
标签: c constants function-pointers typedef