Я только начинаю обнимать указатели функций в C. Чтобы понять, как работает литье указателей функций, я написал следующую программу. Он в основном создает указатель на функцию, которая принимает один параметр, передает его указателю на функцию с тремя параметрами и вызывает функцию, предоставляя три параметра. Мне было любопытно, что произойдет:
#include <stdio.h>
int square(int val){
return val*val;
}
void printit(void* ptr){
int (*fptr)(int,int,int) = (int (*)(int,int,int)) (ptr);
printf("Call function with parameters 2,4,8.\n");
printf("Result: %d\n", fptr(2,4,8));
}
int main(void)
{
printit(square);
return 0;
}
Это компилируется и запускается без ошибок или предупреждений (gcc -Wall на Linux/x86). Выходной сигнал в моей системе:
Call function with parameters 2,4,8.
Result: 4
Таким образом, по-видимому, лишние аргументы просто молча отбрасываются.
Теперь я хотел бы понять, что на самом деле происходит здесь.
- Что касается законности: если я правильно понимаю ответ правильно указатель функции на другой тип, это просто поведение undefined. Так что тот факт, что это работает и дает разумный результат, - это просто удача, правильно? (или симпатией со стороны авторов компилятора).
- Почему gcc не предупредит меня об этом, даже с Wall? Это то, что компилятор просто не может обнаружить? Почему?
Я прихожу из Java, где typechecking намного строже, поэтому это поведение немного смутило меня. Может быть, я переживаю культурный шок: -).