【问题标题】:Function pointer as a const argument函数指针作为 const 参数
【发布时间】:2018-09-02 17:15:36
【问题描述】:

是否可以将函数指针作为 const 参数传递?

我收到以下 gcc 错误:

警告:在“f”的声明中,类型默认为“int” [-Wimplicit-int] void execute(void (const *f)(void));

...编译这段代码时:

#include <stdio.h>

void print(void);
void execute(void (const *f)(void));

int main(void)
{
    execute(print); // sends address of print
    return 0;
}

void print(void)
{
    printf("const!");
}

void execute(void (const *f)(void)) // receive address of print
{
    f();
}

这不是 What is meaning of a pointer to a constant function? 的副本,它处理 指向 const 函数的指针,而不是 const 函数参数

【问题讨论】:

标签: c arguments parameter-passing


【解决方案1】:

你想要的语法是:

void execute(void (* const f)(void));

这表示f 是一个const 指针,指向不带参数的函数((void) 是不带参数的特殊语法)并且不返回任何内容(void)。 * 右侧的 const 表示 指针const。左侧的const 表示指针指向某物,即const

它是一个const 指针的事实意味着你不会在函数中更改f(分配一个新值),如果你这样做了编译器应该会给你一个错误(除非更改被隐藏它,它可以通过演员表)。它没有说明函数本身——指向的函数在任何意义上都不是const,因为参数是const

你写的时候:

void execute(void (const * f)(void));

* 左侧的const 表示指针指向的是const,而不是指针本身是const。由于它是说指针指向那里的某个东西并且您没有列出特定类型,因此编译器会警告您缺少类型(默认为int)。

【讨论】:

    【解决方案2】:

    const 关键字应放在指针符号 (*) 和参数名称(此处为 f)之间:

    void execute(void (* const f)(void))
    {
      f();
    }
    

    现在,如果您尝试更改 f 的值:

    void execute(void (* const f)(void))
    {
      f = print;
      f();
    }
    

    ...您的编译器应该会按预期输出与此类似的错误:

    错误:无法分配给具有 const 限定类型的变量“f”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2021-11-29
      • 2011-02-04
      相关资源
      最近更新 更多