带有 typedef 函数指针的 const 限定符

标签 c constants function-pointers typedef

关于 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/

相关文章:

c - 回溯如何影响解析器识别的语言?

c - 为工具提示使用固定宽度的字体

c++ - 是否允许编译器在重载解析期间选择 const ref 而不是 ref?

Java 可扩展常量

c# - 回调函数在构建和 DLL 时有何用处

c - 测试用例在特定行失败。手动工作正常 - C(大海捞针)

客户端有关recvfrom函数的问题

c++ - 为什么对按值传递的参数使用 const?

multithreading - 定义C++ AMP中的函数

c++ - 使用 C++ 模板的数据映射器设计模式