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
Susan Sarandonasal
2024-12-08 02:08:12483semak imbas

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);

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 = &amp;foo;
std::function<int(const C&, int)> stdf_C_foo = &amp;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, &amp;C::foo);

3. std::Fungsi:

int b = stdf_foobar(a, stdf_foo);

4. Jenis Panggilan Balik Templat:

stdf_transform_every_int_templ(&amp;a[0], 5, &amp;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(&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

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!

Kenyataan:
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