我刚刚注意到,-pedantic -Wall
和gcc
使用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代码吗?如果是这样,那么当您将函数作为函数的参数时会发生什么?
答案 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)(); ... */ }