Это странный заголовок.Я был бы очень признателен, если бы кто-то мог уточнить, что именно я спрашиваю, потому что я сам в этом не уверен.
Я смотрю Стэнфордские видеофильмы о парадигмах программирования (этот учитель потрясающий), и явплоть до пятого видео, когда он начал это делать:
void *lSearch( void* key, void* base, int elemSize, int n, int (*cmpFn)(void*, void*))
Естественно, я подумал про себя: «Ой, я не знал, что вы могли бы объявить функцию и определить ее позже!».Поэтому я создал свою собственную тестовую версию C ++.
int foo(int (*bar)(void*, void*));
int bar(void* a, void* b);
int main(int argc, char** argv)
{
int *func = 0;
foo(bar);
cin.get();
return 0;
}
int foo(int (*bar)(void*, void*))
{
int c(10), d(15);
int *a = &c;
int *b = &d;
bar(a, b);
return 0;
}
int bar(void* a, void* b)
{
cout << "Why hello there." << endl;
return 0;
}
Вопрос о коде заключается в следующем: он провалится, если я объявлю функцию int *bar
в качестве параметра foo
, но не int (*bar)
.Зачем!?
Кроме того, видео смущает меня тем, что его определение lSearch
void* lSearch( /*params*/ , int (*cmpFn)(void*, void*))
вызывает cmpFn в определении, но при вызове функции lSearch
lSearch( /*params*/, intCmp );
также вызывает определенную функцию int intCmp(void* elem1, void* elem2);
, и я не понимаю, как это работает.Почему в lSearch функция называется cmpFn, но определяется как intCmp, которая имеет тип int
, а не int*
и все еще работает?И почему функция в lSearch не должна иметь определенные параметры?