作为参数来起作用

wef*_*fa3 5 c parameters pointers function-pointers function

我只是注意到这个编译没有任何错误或警告使用-pedantic -Wall两者gccclang.

#include <stdio.h>

int x = 0;

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

int main(void) {
    func(puts);
}
Run Code Online (Sandbox Code Playgroud)

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

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

dko*_*kov 2

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

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

int f(void);
/*...*/
g(f);
Run Code Online (Sandbox Code Playgroud)

那么 g 的定义可能是

void g(int (*funcp)(void))
{
    /*...*/
    (*funcp)(); /* or funcp(); ... */
}
Run Code Online (Sandbox Code Playgroud)

或者,等价地,

void g(int func(void))
{
     /*...*/
     func(); /* or (*func)(); ... */
}
Run Code Online (Sandbox Code Playgroud)