Я только начинаю оборачиваться вокруг указателей на функции в 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
Так что, очевидно, лишние аргументы просто молча отбрасываются.
Теперь я хотел бы понять, что на самом деле здесь происходит.
- Что касается законности: если я правильно понимаю ответ на Правильное приведение указателя функции к другому типу , это просто неопределенное поведение. Так что тот факт, что это работает и дает разумный результат, просто чистая удача, верно? (или любезность со стороны авторов компилятора)
- Почему gcc не предупредит меня об этом, даже с Уоллом? Это то, что компилятор просто не может обнаружить? Почему?
Я из Явы, где проверка типов намного строже, поэтому это поведение немного смутило меня. Может быть, я испытываю культурный шок: -).