Fungsi Panggilan Balik dalam C
Bila dan Cara Menggunakan Fungsi Panggilan Balik:
Fungsi panggil balik ialah penunjuk fungsi atau objek yang dihantar sebagai argumen kepada fungsi lain. Fungsi panggil balik ini kemudiannya digunakan dalam fungsi yang dipanggil untuk menyesuaikan kelakuannya berdasarkan logik panggil balik yang disediakan.
Senario biasa di mana fungsi panggil balik digunakan:
Jenis Boleh Panggil dalam C (11):
Kefungsian panggil balik boleh dilaksanakan menggunakan beberapa jenis boleh panggil, termasuk:
Menulis Panggilan Balik:
Sintaks untuk menulis jenis panggil balik berbeza bergantung pada jenis boleh panggil yang digunakan. Berikut ialah gambaran keseluruhan:
1. Penunjuk Fungsi:
typedef int (*f_int_t)(int); int (* foo_p)(int);
2. Penunjuk kepada Fungsi Ahli:
typedef int (C::* f_C_int_t)(int); int (C::* C_foo_p)(int);
3. std::Fungsi:
std::function<int(int)> stdf_foo = &foo; std::function<int(const C&, int)> stdf_C_foo = &C::foo;
4. Jenis Panggilan Balik Templat:
template<class R, class T> void stdf_transform_every_int_templ(int * v, unsigned const n, std::function<R(T)> fp)
Panggilan Balik:
Sintaks untuk memanggil panggil balik berbeza-beza bergantung pada jenis boleh panggil. Berikut ialah gambaran keseluruhan:
1. Penunjuk Fungsi:
int b = foobar(a, foo);
2. Penunjuk kepada Fungsi Ahli:
int b = C_foobar(a, my_c, &C::foo);
3. std::Fungsi:
int b = stdf_foobar(a, stdf_foo);
4. Jenis Panggilan Balik Templat:
stdf_transform_every_int_templ(&a[0], 5, &foo);
Contoh:
Pertimbangkan contoh fungsi berikut yang mengubah setiap integer dalam tatasusunan menggunakan panggilan balik:
void tranform_every_int(int * v, unsigned n, int (*fp)(int)) { for (unsigned i = 0; i < n; ++i) { v[i] = fp(v[i]); } }
Fungsi ini boleh digunakan dengan fungsi panggil balik yang berbeza untuk mencapai yang berbeza tingkah laku:
// Using a function pointer int double_int(int x) { return 2*x; } int a[5] = {1, 2, 3, 4, 5}; tranform_every_int(&a[0], 5, double_int); // Transform the array using the double_int callback // Using lambda expression tranform_every_int(&a[0], 5, [](int x) -> int { return x/2; }); // Transform the array using an anonymous function that divides each element by 2 // Using std::bind int nine_x_and_y (int x, int y) { return 9*x + y; } std::placeholders::_1; tranform_every_int(&a[0], 5, std::bind(nine_x_and_y, _1, 4)); // Transform the array using std::bind with nine_x_and_y
Kesimpulannya, fungsi panggil balik menyediakan mekanisme yang berkuasa dan fleksibel untuk menyesuaikan gelagat fungsi dan membolehkan gelagat masa jalan dinamik dalam C . Ia boleh dilaksanakan menggunakan pelbagai boleh panggil, dan sintaksnya berbeza-beza dengan sewajarnya.
Atas ialah kandungan terperinci Bila dan Bagaimana Saya Harus Menggunakan Fungsi Panggilan Balik dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!