Компиляция с gcc8:
#include <stdio.h>
void some_func(void f1(void), void (*f2)(void))
{
printf("%d\n", f1);
printf("%d\n", f2);
}
Дает (только) следующие предупреждения:
<source>:11:14: warning: format '%d' expects argument of type 'int', but argument 2 has type 'void (*)(void)' [-Wformat=]
printf("%d\n", f1);
<source>:12:14: warning: format '%d' expects argument of type 'int', but argument 2 has type 'void (*)(void)' [-Wformat=]
printf("%d\n", f2);
Почему тип f1
совпадает с типом f2
? Только f2
объявлен как указатель на функцию. Я ожидал бы, что f1
вообще не будет компилироваться, так как он называет тип функции, а не указатель на функцию. Какое правило гласит, что тип функции в списке параметров функции изменяется на указатель на этот тип функции?