作为函数的参数

时间:2016-10-21 08:17:51

标签: c function pointers parameters function-pointers

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

#include <stdio.h>

int x = 0;

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

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

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

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

1 个答案:

答案 0 :(得分:2)

标准允许这样做。从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)(); ... */
}