函数指针作为常量参数

6

能否将函数指针作为常量参数传递?

在编译以下代码时,我得到了以下gcc错误信息:

warning: type defaults to 'int' in declaration of 'f' [-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();
}

这不是指向常量函数的指针的重复,该问题涉及到指向const函数而不是const函数参数


https://dev59.com/jGkw5IYBdhLWcg3wGGm8 - zzxyz
2个回答

6
您需要的语法是:

您需要的语法是:

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

这段话的意思是,f 是一个指向不带参数((void) 是表示没有参数的特殊语法)且返回值为 void 的函数的 const 指针。 * 右侧的 const 表示这个指针const 的。左侧的 const 表示指针指向的东西const 的。

它是一个 const 指针意味着你不能在函数中改变 f(赋予新值),如果你这样做编译器会给你一个错误(除非更改被隐藏��来了,比如通过转换)。它并不说任何关于函数本身的事情 - 被指向的函数在任何意义上都不是 const 的,因为参数是 const 的。

当你写:

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

* 左边的 const 意味着指针指向的是一个 const 对象,而不是指针本身是 const 。由于它表明指针指向了某个东西,但您没有列出具体类型,编译器会警告缺少类型(并默认为 int )。


0

const关键字应该放置在指针符号(*)和参数名称(这里是f)之间:

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

现在如果你尝试改变f的值:

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

...你的编译器应该会输出一个类似于下面的错误信息,这是预期的:

错误:无法给常量限定类型的变量 'f' 赋值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接