【问题标题】:Function as parameter to function [duplicate]函数作为函数的参数[重复]
【发布时间】:2017-03-03 11:14:40
【问题描述】:

我刚刚注意到,使用 -pedantic -Wallgccclang 编译时没有任何错误或警告。

#include <stdio.h>

int x = 0;

void func(int f(const char *)) {
    f("func()!");
}

int main(void) {
    func(puts);
}

在这种情况下,参数f 似乎被视为指向函数int (*)(const char *) 的指针。

但这是我从未见过或听说过的行为。这是合法的C代码吗?如果是这样,那么当您将函数作为函数的参数时会发生什么?

【问题讨论】:

标签: c function pointers parameters function-pointers


【解决方案1】:

这是标准允许的。来自 C99 标准第 6.9.1 章(取自 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf):

示例 2 要将一个函数传递给另一个函数,可能会说

int f(void);
/*...*/
g(f);

那么 g 的定义可能是这样的

void g(int (*funcp)(void))
{
    /*...*/
    (*funcp)(); /* or funcp(); ... */
}

或者,等价的,

void g(int func(void))
{
     /*...*/
     func(); /* or (*func)(); ... */
}

【讨论】: