Rumah > pembangunan bahagian belakang > C++ > Bila dan Bagaimana Saya Harus Menggunakan Fungsi Panggilan Balik dalam C?

Bila dan Bagaimana Saya Harus Menggunakan Fungsi Panggilan Balik dalam C?

Susan Sarandon
Lepaskan: 2024-12-08 02:08:12
asal
487 orang telah melayarinya

When and How Should I Use Callback Functions in C  ?

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:

  • Menulis kod generik yang boleh berfungsi dengan logik yang berbeza dengan menerima panggilan balik yang berbeza.
  • Melaksanakan sistem berasaskan peristiwa untuk memberitahu pihak yang berminat tentang peristiwa.
  • Mendayakan gelagat masa jalan dinamik, seperti mengubah gelagat tindakan tertentu berdasarkan input pengguna.

Jenis Boleh Panggil dalam C (11):

Kefungsian panggil balik boleh dilaksanakan menggunakan beberapa jenis boleh panggil, termasuk:

  • Penunjuk fungsi (termasuk penuding kepada fungsi ahli)
  • std::objek fungsi
  • Ekspresi Lambda
  • Ikatan ungkapan
  • Objek fungsi (kelas dengan operator panggilan fungsi terlampau beban operator())

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);
Salin selepas log masuk

2. Penunjuk kepada Fungsi Ahli:

typedef int (C::* f_C_int_t)(int);
int (C::* C_foo_p)(int);
Salin selepas log masuk

3. std::Fungsi:

std::function<int(int)> stdf_foo = &amp;foo;
std::function<int(const C&, int)> stdf_C_foo = &amp;C::foo;
Salin selepas log masuk

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)
Salin selepas log masuk

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);
Salin selepas log masuk

2. Penunjuk kepada Fungsi Ahli:

int b = C_foobar(a, my_c, &amp;C::foo);
Salin selepas log masuk

3. std::Fungsi:

int b = stdf_foobar(a, stdf_foo);
Salin selepas log masuk

4. Jenis Panggilan Balik Templat:

stdf_transform_every_int_templ(&amp;a[0], 5, &amp;foo);
Salin selepas log masuk

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]);
  }
}
Salin selepas log masuk

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(&amp;a[0], 5, double_int); // Transform the array using the double_int callback

// Using lambda expression
tranform_every_int(&amp;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(&amp;a[0], 5, std::bind(nine_x_and_y, _1, 4)); // Transform the array using std::bind with nine_x_and_y
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan