คําแนะนําใน C เป็นคุณสมบัติที่ซับซ้อนมากแต่ยังมีประสิทธิภาพสูง ซึ่งนักพัฒนาการโทรกลับได้จัดการระบบควบคุมการโทรกลับ -- การทํางานนี้ส่งผ่านไปยังการทํางานอื่น ๆ และเรียกดูในภายหลัง โดยปกติแล้วจะเป็นการตอบสนองต่อเหตุการณ์หรือสภาวะต่าง ๆ เทคนิคนี้จะเป็นรากฐานในการเขียนโปรแกรมแบบปฏิทินขับเคลื่อน, ออกแบบไลบรารี, และพัฒนา API นําเสนอความยืดหยุ่นและใช้รหัสอีกครั้ง บทความนี้จะสํารวจคู่มือการทํางานในความลึก จากรูปแบบพื้นฐานไปยังรูปแบบที่ก้าวหน้า โดยมีการโฟกัสในการเรียกกลับ

การ เข้าใจ จุด เด่น ใน การ ทํา งาน ของ คุณ ใน C

ทิศทางของฟังก์ชัน คือตัวแปรที่จัดเก็บค่าตําแหน่งหน่วยความจําของฟังก์ชัน ซึ่งไม่เหมือนตัวชี้ที่ชี้ไปยังข้อมูล, ทิศทางของฟังก์ชัน จะชี้ไปยังรหัสประมวลผลได้ การถอดรหัสตัวชี้ของฟังก์ชันนั้น ต้องระบุชนิดของการคืนค่าและประเภทของพารามิเตอร์ของฟังก์ชันด้วย ตัวอย่างเช่น:

int (*funcPtr)(int, int);

นี่ประกาศ [FLT: 1] เป็นคํานําหน้าไปยังฟังก์ชันที่ยอมรับค่าสอง พารามิเตอร์แล้วคืนค่า . วงเล็บรอบ [FLT: 4] เป็นสิ่งจําเป็น; ไม่มี (FLT: 5) จะประกาศฟังก์ชันย้อนกลับ [FLTT: 6]. การกําหนดที่อยู่ตรงไปตรงมา:

int add(int a, int b) { return a + b; }
funcPtr = add; // or &add

การขอผ่านตัวชี้นั้นง่ายพอ ๆ กัน

int result = funcPtr(5, 3); // calls add(5, 3)

ส่วนเสริมสําหรับทํางานถูกพิมพ์: ลายเซ็นของตัวชี้จะต้องตรงกับลายเซ็นของฟังก์ชันที่กําหนด

ใช้ตัวพิมพ์ธรรมดาสําหรับตัวชี้ของฟังก์ชัน

  • [FLT: 0] ฟังก์ชัน Callback – โฟกัสหลักของบทความนี้
  • [FLT: 0] เครื่อง[FLT: 1] - โต๊ะตัวชี้ของฟังก์ชัน ทําหน้าที่เปลี่ยน
  • [FLT: 0] Puggin หรือ สถาปัตยกรรมไดรเวอร์ - การโหลดไดไดนามิคของฟังก์ชัน
  • [FLT: 0] อาร์กิวเมนต์ – ใช้ในฟังก์ชันมาตรฐานห้องสมุดเช่น [FLT: 9].
  • [FLT: 0]. สืบค้นตาราง [FLT: 1] – ผังของตัวชี้ของฟังก์ชัน สําหรับระบบเมนู หรือตัวแปลคําสั่ง

การ กลับ เยี่ยม แบบ ไม่ มี การ ควบคุม กับ ผู้ ชี้ แนะ ใน การ ทํา งาน

การ เรียก กลับ เป็นฟังก์ชัน ที่ มี การ ส่ง ที่ อยู่ ไป ยัง อีก ฟังก์ชัน หนึ่ง โดย ทํา ให้ สามารถ เรียก ฟังก์ชัน นี้ ว่า การ กลับ เยี่ยม แบบ ที่ เหมาะ สม.

#include <stdio.h>

void executeOperation(int a, int b, int (*operation)(int, int)) {
 int result = operation(a, b);
 printf("Result: %d\n", result);
}

int add(int x, int y) { return x + y; }
int multiply(int x, int y) { return x * y; }

int main() {
 executeOperation(5, 3, add);
 executeOperation(5, 3, multiply);
 return 0;
}

ที่นี่ [FLT: 11] รับตัวชี้ของฟังก์ชัน [FLT: 12] และเรียกมัน [FLT: 13] และ[FLT: ⁇ ] รูปแบบนี้ถูกใช้อย่างกว้างขวางในส่วนติดต่อผู้ใช้แบบกราฟิก (GUI) กรอบ, anychronous I/O และการจัดการเหตุการณ์ระดับระบบ (FLLT:14).

เรียกกลับด้วยคอนเท็กซ์ของผู้ใช้

บ่อยครั้งที่การเรียกกลับต้องการข้อมูลเพิ่มเติมเกินตัวแปรคงที่ เทคนิคทั่วไปคือการส่งผ่าน [FLT: 15] ตัวชี้ของบริบทการโทร:

typedef void (*Callback)(int event, void* context);

void registerCallback(Callback cb, void* ctx) {
 // store cb and ctx internally
 // later, invoke:
 cb(EVENT_TIMER, ctx);
}

void myEventHandler(int event, void* data) {
 int* value = (int*)data;
 printf("Event %d, value %d\n", event, *value);
}

int main() {
 int myData = 42;
 registerCallback(myEventHandler, &myData);
 return 0;
}

รูปแบบนี้ใช้ในไลบรารีเช่น GLTK+ ซึ่งมีการเรียกข้อมูลกลับมาเป็นข้อมูลผู้ใช้ผ่านทาง [FLT: 17].

สเป็กตรัมสําหรับความชัดเจนและการรักษาความทนทาน

การ ใช้ [FLT: 18] ช่วย ปรับ ปรุง ความ สามารถ ใน การ อ่าน และ การ บํารุง รักษา ที่ ง่าย ขึ้น:

typedef int (*Operation)(int, int);

void execute(Operation op, int a, int b) {
 if (op) {
 printf("Result: %d\n", op(a, b));
 }
}

ปัจจุบัน [FLT: 20] เป็นชื่อที่สะอาด ซึ่งมีประโยชน์อย่างยิ่งเมื่อใช้ฟังก์ชัน Cackback หลายแบบในโค้ดเบสขนาดใหญ่

การ ตก หลุม พราง และ การ ปฏิบัติ ที่ ดี ที่ สุด

  • [FLT: 0]. สืบค้นเมื่อทําการเ ปล. ก่อน . . ตรวจสอบตัวชี้ของฟังก์ชันเสมอไม่ใช่ [FLT: 21] ก่อนจะเรียกมัน. นี่ป้องกันการชนกันของตัวชี้ที่ยังไม่ได้ระบุหรือตัวชี้ที่เคลียร์อย่างผิดพลาด.
  • [FLT: 0] ไม่ถูกต้อง printive searches [FLT: 1] – ผ่านฟังก์ชันที่มีลายเซ็นที่เข้ากันไม่ตรงกัน นําไปสู่พฤติกรรมที่นิยามไม่ได้ เปิดใช้งานคําเตือน ([FLT: 22] เพื่อจับข้อผิดพลาดดังกล่าว
  • [FLT: 0] เรียกความแตกต่างของการประชุมว่า – บนแพลตฟอร์มบางแบบ โดยเฉพาะเมื่อผสม C Briarys กับภาษาอื่น ๆ การเรียกการประชุมต้องตรงกัน (เช่น บนวินโดวส์ (พ.ศ.
  • [FLT: 0]. ความปลอดภัย - ถ้าการเรียกกลับจากหลายเธรด เพื่อให้แน่ใจว่ารหัสการเรียกกลับจะถูกปรับหรือปรับให้ตรงกันอย่างถูกต้อง
  • [FLT: 0] เวลาของบริบทหลัก[FLT: 1] – ตัวชี้ของบริบทที่ผ่านไปยังตัวเรียกต้องยังคงใช้งานได้ตลอดเวลา การเรียกกลับอาจจะเรียกตัวข้อมูลได้ ใช้หน่วยความจําแบบคงที่หรือกองได้ตามต้องการ

รูป แบบ ที่ ดี กว่า:

ส่วนเสริมการทํางานสามารถถูกจัดเก็บไว้ในอาร์เรย์ เพื่อสร้างตารางส่ง, เปิดใช้งานเครื่องสถานะสะอาด หรือผู้ดูแลคําสั่ง ตัวอย่างเช่น เครื่องคิดเลขที่รองรับการดําเนินการหลาย ๆ อย่าง:

typedef int (*Operation)(int, int);

int add(int x, int y) { return x + y; }
int sub(int x, int y) { return x - y; }
int mul(int x, int y) { return x * y; }
int divide(int x, int y) { return y ? x / y : 0; }

Operation operations[] = { add, sub, mul, divide };
const char* opNames[] = {"add", "sub", "mul", "div"};

int main() {
 int a = 10, b = 2;
 for (int i = 0; i < 4; ++i) {
 printf("%s: %d\n", opNames[i], operations[i](a, b));
 }
 return 0;
}

รูปแบบนี้สามารถขยายได้ และหลีกเลี่ยงการยืดยาว หรือ โซ่ (FLT:26)

การ เปรียบ เทียบ กับ ภาษา อื่น

ภาษาเช่น C++ ใช้ตัวชี้ของฟังก์ชัน แต่ยังมีตัวชี้ของฟังก์ชัน, แลมดา และ[FLT: 27] สําหรับความยืดหยุ่นเพิ่มเติม อย่างไรก็ตาม C ยังคงใช้รากฐาน และตัวชี้ของความเข้าใจเป็นองค์ประกอบสําคัญในการทํางานกับระบบปฏิบัติการ เอพีไอ (เช่น POSIX Signor Signations, [FLT: 28], และรหัสข้อมูลมรดก ห้องสมุด C ตัวเองใช้ตัวชี้ตําแหน่ง [FT: ⁇ และ[FT] [FL: 30] สาธิตการจําแนกข้อมูลข้อมูลระบบ

การพิจารณาผลงาน

ทิศทางการทํางานมีแกนนําน้อยที่สุด -- ตามปกติแล้ว โพรโตคอลเดียวที่อ้างถึง และโทรแบบอ้อม หน่วยประมวลผลแบบสมัยใหม่จัดการในสาขาที่มีประสิทธิภาพทางอ้อม ผ่านการคาดการณ์ของสาขา แต่การใช้งานมากเกินไป อาจทําให้เกิดความช้าต่ําลงได้

ตัว อย่าง การ เรียก กลับ ของ โลก จริง ใน ซี

  • [FLT: 0] ผู้ดูแลด้านภาษา – บันทึกการเรียกกลับสําหรับสัญญาณระบบปฏิบัติการ
  • [FLT: 0] ฟังก์ชัน – รับตัวชี้ของฟังก์ชันและเหตุผลบริบท (FLT:32).
  • [FLT: 0] วงจรเหตุการณ์ในห้องสมุดระดับต่ํา – libv, libvv, และห้องสมุดเหตุการณ์ใกล้เคียงกัน ใช้การเรียกกลับสําหรับ I/O, Times และสัญญาณ.
  • [FLT: 0] ทําหน้าที่เรียงอัลกอริทึม – และ จากห้องสมุดมาตรฐาน C.
  • [FLT: 0]. GUI choolkits –Gtk+ และ EFL (มูลนิธิอีเทนเทนเมนต์) ใช้การเรียกกลับอย่างกว้างขวางสําหรับการจัดการวิดเจ็ต.

รูปแบบการวน

แนวทางการทํางานคือ หลักสําคัญของโปรแกรม C, การเปิดใช้งานกลไกการโทรกลับที่ ยืดหยุ่น, การประมวลผล, และการใช้รหัสซ้ําได้โดยเข้าใจการประกาศ, การใช้เครื่องหมายการค้า, การใช้เครื่องหมายพิมพ์, และรูปแบบขั้นสูงเช่นตารางส่ง, คุณสามารถออกแบบระบบการทํางานที่ทนทานและรักษาได้, รองรับการปฏิบัติที่ดีที่สุด: การตรวจสอบสําหรับ [FLT: 35] ลายเซ็น เข้ากันได้, การจัดการบริบทที่เข้ากันได้, และเอกสารการเรียกกลับได้อย่างชัดเจน คุณสามารถควบคุมการโทรกลับได้เต็มความสามารถนี้

สําหรับการอ่านเพิ่มเติม โปรดอ้างอิงถึง [FLT: 0] C anguages for points [FLT: 1) และสํารวจว่าตัวชี้ของฟังก์ชันถูกใช้ใน คู่มือห้องสมุด GLC (FLT:3]. การดําดิ่งลึกลงในโปรแกรมของเหตุการณ์แบบไดรฟ์กับโทรแบ็คสามารถพบได้ใน [FLT: 4] บทความเกี่ยวกับเหตุการณ์ [FLTT] นี้เกี่ยวกับเหตุการณ์ [FTLTL: ⁇ .