Функция как параметр функции [дубликат]


На этот вопрос уже есть ответ здесь:

Я только что заметил, что это компилируется без каких-либо ошибок или предупреждений, используя -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-код? И если да, то что происходит, когда у вас есть функция в качестве параметра функции?
1 5

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)(); ... */
}