Функция как параметр функции [дубликат]
На этот вопрос уже есть ответ здесь:
Я только что заметил, что это компилируется без каких-либо ошибок или предупреждений, используя-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 *)
в этом случае дело.
1 ответ:
Это допускается стандартом. Из главы 6.9.1 стандарта C99 (взято из 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)(); ... */ }