代码之家  ›  专栏  ›  技术社区  ›  thndrwrks

带有typedef ed函数指针的常量限定符

  •  1
  • thndrwrks  · 技术社区  · 8 年前

    关于类型定义的函数指针在函数的参数中是const限定的,C标准有什么要说的?例如,假设我有以下类型

    typedef int (*Operation)(int a, int b);
    

    我有一系列的运算,取两个int,执行这个运算,然后返回一个int。然后我有一个函数,它执行实际的函数指针调用。

    int doOpOnce(const Operation op, int a, int b)
    {
        return op(a, b);
    }
    

    doOpOnce 我还想向 杜蓬斯

    int doOpOnce(const Operation op, int a, int b)
    int doOpOnce(Operation const op, int a, int b)
    

    最后,这里有一个例子。它是用gcc 4.9.2编译的,带有标志 -std=c99 -Wall -Wextra -pedantic 当我试图更改常量函数指针时,它正确地出错了。

    #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;
    }
    

    我不想将常量限定符添加到 Operation typedef,因为我有其他可以修改的函数 活动 指针。我只是想在某些情况下打字更有力。

    3 回复  |  直到 8 年前
        1
  •  1
  •   templatetypedef    8 年前

    如果参数类型为操作,则调用方将指针的副本传递给函数,因此函数实际上无法更改指针在调用方中的回指位置。在这里添加const关键字只是实现中的一种防御技术,它会阻止您重新分配本地副本。从这个意义上讲,您甚至不需要const限定符来向库的客户机发送任何信号。

    为了解决您的另一个问题,const的两个位置具有相同的含义,因此您可以选择任何一个。

        2
  •  1
  •   chux    8 年前

    int doOpOnce(Operation op, int a, int b); 还有你的。c文件实现 int doOpOnce(Operation const op, int a, int b) { 所以“要保证函数指针在doopon过程中不会改变”


    “我还想向doOpOnce的用户证明,它实际上会调用提供给它的函数。”属于代码文档。

    int doOpOnce(Operation const op, int a, int b); 不足以保证“它将实际调用给定的函数”。

        3
  •  0
  •   Vlad from Moscow    8 年前

    对于函数的用户 doOpOnce 指向函数的指针是否用 const 因为函数处理用户作为参数提供的原始指针的副本。

    对于函数的用户,这两个函数声明

    int doOpOnce(const Operation op, int a, int b);
    

    int doOpOnce( Operation op, int a, int b);
    

    函数的局部变量 作为其任何参数。 .