บทที่ 13 Pre-processor directive & macro Kairoek choeychuen
Pre-processor directive & Macro คืออะไร คำสั่งที่ประกาศไว้ด้านบนสุด คอมไพเลอร์จะกระทำ Pre-processor & Macro ก่อนจะประมวลผลโปรแกรม - สามารถเป็น ค่าคงที่, ฟังก์ชันหรือการตรวจสอบเงื่อนไข (คล้าย คำสั่ง if)
ตารางสรุปPre-processor directive คำอธิบาย #include แทรกไฟล์ที่ต้องการประมวลผลร่วมกับโปรแกรม #if ใช้ตรวจสอบเงื่อนไขก่อนการประมวลผลโปรแกรม #ifdef ใช้ตรวจสอบ Macro ที่ถูกสร้างโดย #define #ifndef ใช้ตรวจสอบว่า Macro ไม่ถูกประกาศใช่ไหม #elif หากตรวจสอบเงื่อนไข #if, #ifdef และ #ifndef แล้วเป็นเท็จ ก็จะมาตรวจสอบ เงื่อนไขที่ #elif #else หากตรวจสอบเงื่อนไข #if, #ifdef , #ifndef และ #elif แล้วเป็นเท็จ ก็จะมาตรวจสอบ เงื่อนไขที่ #else #endif ใช้ระบุจุดสิ้นสุดของเงื่อนไข #define ใช้สร้าง Macro #undef ใช้ยกเลิก Macro
Macro อาจเป็น ค่าคงที่, ฟังก์ชัน มาโครมาตรฐาน (Standard predefined macro) มาโครที่ผู้ใช้กำหนดเอง (User predefined macro)
มาโครมาตรฐาน - มาโครที่ภาษาซี จัดไว้ให้ผู้ใช้เรียกใช้งานได้ทันที - ชื่อมาโครมาตรฐาน จะขึ้นต้นและปิดท้ายด้วย __ (underscore 2 ตัวติดกัน) มาโครมาตรฐาน คำอธิบาย __FILE__ ดึงชื่อไฟล์ที่เรากำลังเขียนโปรแกรม __LINE__ ดึงหมายเลขบรรทัดที่เรากำลังทำงานอยู่ __DATE__ ดึงวันที่เราเริ่มรัน Pre-processor ในรูปแบบสตริง 11 ตัวอักษร __TIME__ ดึงเวลาที่เราเริ่มรัน Pre-processor ในรูปแบบสตริง 8 ตัวอักษร __STDC__ ใช้ตรวจสอบว่า c compiler ที่ใช้เป็นไปตามมาตรฐาน ISO/ANSI C หรือไม่ ถ้าเป็นจะส่งค่า 1 ถ้าไม่เป็นจะส่งค่า 0 ออกมา
เรียกใช้ Macro เป็นการแทรกคำสั่งที่สร้างไว้ ที่ตำแหน่งนี้ ตัวอย่างการใช้งาน Standard Predefined Macros สร้าง Macro เรียกใช้ Macro เป็นการแทรกคำสั่งที่สร้างไว้ ที่ตำแหน่งนี้
ก่อนรันคำสั่งใน main คำสั่งในส่วน Pre-processor directive จะไปแทนที่ ในตำแหน่งที่เรียนใช้ Pre-processor
#define ชื่อMacro ค่าที่ต้องการกำหนดให้Macro Macro ที่ผู้ใช้กำหนดเอง ด้วยคำสั่ง #define รูปแบบ #define ชื่อMacro ค่าที่ต้องการกำหนดให้Macro ตัวอย่าง Macro อย่างง่าย #define PI 3.14 //สร้างค่าคงที่ PI = 3.14 #define TIMES 2 //สร้างค่าคงที่ TIMES = 2 #define ROUND 3*TIMES //สร้างค่าคงที่การคำนวณ //ROUND = 3* TIMES = 3*2=6 #define ADD 2+1+a //สร้างค่าคงที่การคำนวณ //ADD = 2+1+ตัวแปร a
Macro ที่สามารถรับพารามิเตอร์ได้ รูปแบบ #define ชื่อMacro(อาร์กิวเมนต์) ฟังก์ชันของอาร์กิวเมนต์ ตัวอย่าง Macro ที่สามารถรับค่าพารามิเตอร์ได้ #define SQUARE(A) (A*A) //สร้างฟังก์ชัน A ยกกำลังสอง #define ADD(B) (B+B) //สร้างฟังก์ชัน B+B
#define ชื่อMacro(arg1,arg2,…,arg n) เงื่อนไข รูปแบบ #define ชื่อMacro(arg1,arg2,…,arg n) เงื่อนไข ตัวอย่าง Macro แบบมีเงื่อนไข #define MAX(x,y) x>y ? x : y //สร้างฟังก์ชันหาค่าสูงสุด //ระหว่าง x, y การใช้ If อย่างย่อ แบบเต็มแสดงได้ดังนี้ If (x>y) MAX = x Else MAX = y
Macro แบบมีเงื่อนไข (หลายบรรทัด) รูปแบบ #define ชื่อMacro(arg1,arg2,…,arg n) { \ คำสั่ง 1; \ คำสั่ง 2; \ …. \ คำสั่ง n;}
ตัวอย่าง Macro แบบมีเงื่อนไข (หลายบรรทัด)
ตัวอย่างการใช้ #ifdef, #ifndef, #else, #endif, #undef ตรวจสอบ A ถูก define ? เปลี่ยนค่า A ต้องทำการ #undef A ก่อนเสมอ ทางเลือกสุดท้ายเมื่อเงื่อนไขก่อนหน้าเป็นเท็จ สิ้นสุดการตรวจสอบเงื่อนไข หลังจากรัน Pre-processor directive
ตัวอย่างการใช้ #ifdef, #ifndef, #else, #endif, #undef แทรกไฟล์ font1.inc ไว้ในส่วน Pre-processor directive แทรกไฟล์ font2.inc ไว้ในส่วน Pre-processor directive
เรียกใช้ฟังก์ชันที่อยู่ในไฟล์ font2.inc ตัวอย่างการใช้ #ifdef, #ifndef, #else, #endif, #undef เรียกใช้ฟังก์ชันที่อยู่ในไฟล์ font1.inc (ไฟล์ที่จะแทรกอาจมีนามสกุลอื่นๆ เราสามารถตั้งนามสกุลเองได้ตามใจ) เรียกใช้ฟังก์ชันที่อยู่ในไฟล์ font2.inc