ระบบควบคุมและอัตโนมัติ
ใช้แมครอสอย่างมีประสิทธิภาพใน C สําหรับความจุและซ่อมแซม
Table of Contents
Macros in C เป็นคุณสมบัติที่ทรงพลังของขั้นตอนก่อนประมวลผลที่ช่วยให้โปรแกรมเมอร์สามารถกําหนดค่าคงที่ได้, ในบรรทัดรหัส genpet และทําการคอมไพล์ตามเงื่อนไข เมื่อใช้อย่างมีประสิทธิภาพแล้ว จะเพิ่มความทนทานและรักษาความสะอาดได้อย่างมีนัยสําคัญ ทําให้นักพัฒนาสามารถเขียนได้สะอาด, ยืดหยุ่นมากขึ้น อย่างไรก็ตาม พลังของพวกเขามาพร้อมกับความเสี่ยง; การใช้แมโครสามารถแนะนําข้อผิดพลาดที่ไม่เหมาะสมและทําให้โปรแกรมดีบั๊กง่ายขึ้น บทความนี้สามารถสํารวจวิธีควบคุมความทนทานได้สูงสุด ในขณะที่หลีกเลี่ยงการถูกใช้งานทั่วไป,
มา คอ รอส คือ อะไร?
Macros ได้ถูกกําหนดโดยใช้คําสั่ง [FLT: 0] และประมวลผลโดย C Princess ก่อนการคอมไพล์เริ่ม การประมวลผลแบบเติมข้อความอย่างง่าย: ทุก ๆ ครั้งของชื่อ เมกะทรอนจะถูกแทนที่ด้วยคําจํากัดความของโควต้า การแทนที่นี้เป็นการใช้ตัวพิมพ์เฉพาะตัวพิมพ์และไม่เคารพขอบเขตหรือพิมพ์ Macros สามารถ [FT] [FLT] [FT] [FT] ใช้สําหรับค่าคงที่ หรือ [FL] [F] [F] [FL] [F] [FT] [FT]]] [/TL] ใช้รหัสต่าง ๆ (T] (TL] ) เพื่อใช้อ้างอิง (ตัวพิมพ์ ไมโครโค้ด (TIFT)
#define PI 3.14159 // object-like macro
#define SQUARE(x) ((x)*(x)) // function-like macro
การ เข้าใจ ขั้น ตอน ก่อน ประมวล ผล ดัง กล่าว สําคัญ มาก เพราะ เมกะ ไม่ ได้ ทํา ตาม กฎ อย่าง เดียว กับ การ ทํา งาน หรือ ความ ตัวแปร.
ประโยชน์ ของ มา คอ รส สําหรับ การ ใช้ รหัส ความ สามารถ และ การ ซ่อม
เมื่อนําไปใช้คิดแมโครให้ประโยชน์ คอนกรีตหลายอย่าง ในโค้ดพื้นฐานขนาดใหญ่หรือประสิทธิภาพที่ไวต่อการทํางาน:
- [FLT: 0] Code Resussion : กําหนดการคํานวณทั่วไปหรือ genpet ครั้งเดียวและใช้ตลอดโปรแกรม เปลี่ยนการปรับปรุงแมโครทุก ๆ กรณีโดยอัตโนมัติ
- [FLT: 0] การแยกชื่อเลขวิเศษ แทนการกระจายอักษรตามตัวอักษรเช่น หรือ ให้ชื่อที่มีความหมายแก่มัน สิ่งนี้ปรับปรุงความน่าอ่านและทําให้ตัวแปรที่ลอยได้ง่ายขึ้น
- [FLT: 0] Perphorance Gen : การเคลื่อนตัวแบบ KAPA ที่คล้ายกับการเรียกดูตําแหน่ง สําหรับการผ่าตัดขนาดเล็กที่ถูกใช้บ่อย (เช่น min/max, square), มาโครสามารถเร็วกว่าการทํางานในบางระบบ ที่ไม่มีการรับรองการเข้าแข่งขัน (in)
- [FLT: 0] การควบรวม [FLTTT:1]: Macros ทํางานในมือ [FLT: 4] [FLT: ]] [FLT: 5] และ[FLT: 5]] และ[FLT: 6] เพื่อรวมหรือแยกรหัสตามเงื่อนไขการรวมเวลา นี่จําเป็นสําหรับรหัสแพลตฟอร์ม, การแบ่งประเภท, การตกแต่ง หรือการสลับตัว
- [FLT: 0] การปรับแต่งแบบย่อ: โดยนิยามแมโครที่แตกต่างจากหัวกระดาษหนึ่งหัว คุณสามารถเปลี่ยนพฤติกรรมของโค๊ดทั้งชุดได้โดยไม่ต้องแตะแฟ้มคําสั่ง
การ เขียน โร บิน ส์ มา คอ โร โร: การ ฝึก อบรม ที่ ดี ที่ สุด
การ ปรับ ตัว ของ เมกะ ดีส ก็ เป็น อันตราย ด้วย.
พารามิเตอร์ และ ทั้ง หมด เสมอ
เนื่องจากการแทนที่ข้อความ การแทนที่การดําเนินการสามารถทําลายได้ เมกะจูเช่น [FLT: 7] จะขยาย [FLT: 8] ไปยัง [FLT: ⁇ (ซึ่งเทียบเท่ากับ 11 ไม่ใช่ 25) การแก้ไขคือ การปิดพารามิเตอร์ทุกตัวในวงเล็บ และห่อเงื่อนไขทั้งหมด:
#define SQUARE(x) ((x) * (x)) // now SQUARE(3+2) works correctly
หลีก เลี่ยง การ แยกแยะ อาร์กิวเมนต์ ออก มา มาก มาย
การโต้แย้งของแมคโครจะถูกแทนที่ด้วยข้อมูล- IS หากการโต้แย้งมีผลข้างเคียง (เช่น [FLT: 11]) อาจประเมินได้มากกว่าหนึ่งครั้ง ตัวอย่างเช่น:
#define MAX(a,b) ((a) > (b) ? (a) : (b))
int x = 5;
int max = MAX(x++, 10); // expands to ((x++) > (10) ? (x++) : (10)) // x incremented twice!
เพื่อ หลีก เลี่ยง การ ทํา เช่น นี้ จง ใช้ การ ตั้ง ชื่อ ผู้ ใช้ อย่าง ระมัดระวัง หรือ ใช้ การ ตั้ง ชื่อ ผู้ ใช้ อย่าง เหมาะ สม.
ใช้อักษรตัวใหญ่สําหรับชื่อ Macro
โดย การ ประชุม ภาค เมกะ ถูก เขียน ด้วย อักษร ตัว ใหญ่ (เช่น [FLT: 13]] [FLT: 14]. นี่ ทํา ให้ มัน โดด เด่น จาก ตัวแปร และ การ ทํา งาน, ลด โอกาส ที่ จะ เกิด อุบัติเหตุ.
จบ Macros กับ do-water สําหรับหลายบล็อกการ หลายระบบ
เมื่อกําหนดหน่วยวัดที่มีประโยคหลายประโยค ให้พันเป็นวง [FLT: 15] ซึ่งจะทําให้ความประพฤติของแมโครถูกต้องในทุกบริบท (เช่น หลังจาก [FT:16] ไม่มีสายรัด):
#define LOG_ERROR(msg) do { \
fprintf(stderr, "Error: %s\n", msg); \
exit(1); \
} while (0)
เอกสาร Macros อย่างเต็มรูปแบบ
Macros ไม่ใช้ลักษณะการประกอบหน้าที่เอง ให้เพิ่มคําอธิบายเสมอ ซึ่งอธิบายการโต้แย้ง, พฤติกรรม, และข้อจํากัดใดๆ ใช้คอมเม้นสไตล์ Doxygen เมื่อเหมาะสม
เมโครเทคนิกขั้นสูง
การ ทํา เช่น นี้ อาจ ทํา ให้ เมกะ ของ คุณ ยืดหยุ่น ได้ มาก ขึ้น.
การผูกขาดกับ [FLT: 18]
ผู้ดําเนินการเปลี่ยนการโต้แย้งแบบแมโครเป็นเส้นเชือกตามตัว มันมีประโยชน์ต่อการดีบั๊กหรือทําไม้:
#define PRINT_VAR(x) printf(#x " = %d\n", x)
int value = 42;
PRINT_VAR(value); // prints: value = 42
Takes transing with
[FLT: 22] ตัวดําเนินการจะรวมเครื่องหมายสองตัวเข้าด้วยกันเป็นเครื่องหมายเดียว ซึ่งจะช่วยให้คุณสร้างตัวระบุแบบไม่ตายตัวในเวลารวม:
#define CREATE_VAR(prefix, index) prefix ## index
int CREATE_VAR(arr, 0) = 10; // becomes int arr0 = 10;
การ ทํา พาส เตอร์ มี การ ใช้ กัน อย่าง กว้าง ขวาง ใน กลุ่ม ดาว X และ เพื่อ สร้าง รูป แบบ การ เขียน รหัส ซ้ํา ๆ.
Variadimasros (C99)
โดย กํากับ ใน C99, วารีดิก มาโครส ยอมรับ จํานวนอาร์กิวเมนต์ ที่แปรผัน ได้ โดย [FLT: 24]. นี้ทําให้โคโมเมนต์และแรงเร่งการดีบั๊ก ยืดหยุ่น:
#define DEBUG_PRINT(fmt, ...) \
fprintf(stderr, "DEBUG: " fmt, __VA_ARGS__)
DEBUG_PRINT("x = %d, y = %d", x, y);
ใน C11 และต่อมา คุณสามารถใช้ เพื่อจัดการกับการไล่จุลภาคในข้อโต้แย้งว่าง ๆ ได้ ปรับปรุงความจุลภาค
หลุม พราง ทั่ว ไป และ วิธี หลีก เลี่ยง หลุม พราง
แม้นักพัฒนาซีที่มีประสบการณ์ยังพบกับแมลงที่เกี่ยวข้องกับแมโคร การจําสิ่งรบกวนเหล่านี้ก่อนเวลาอันควรป้องกันอาการปวดหัว
- [FLT: 0] สูญเสียครึ่งโคลอนหรือสายรัด: เมกะที่ขยายไปยังบล็อกโดยไม่มีการลาก กึ่งโคลอนสามารถทําให้เกิดข้อผิดพลาดทางไวยากรณ์ รูปแบบการ [FLT: 27] รูปแบบการแก้นี้
- [FLT: 0] นักแสดงนําเรื่องประหลาดใจ : ผู้ปกครองเสมอ -- ตามที่กล่าวไว้ข้างต้น
- [FLT: 0] การลดขนาดของโคโระที่มีฟังก์ชัน [FLT: 1]: ถ้าคุณนิยามแมโครที่มีชื่อเดียวกันกับฟังก์ชันห้องสมุดมาตรฐาน มันสามารถบังคับมันเงียบ ๆ ใช้ชื่อหรือ # ไม่ป้องกัน
- [FLT: 0] Non-continuant constant previewers : axs parame คล้ายกับวัตถุถูกใช้เป็นค่าคงที่ แต่ไม่ได้พิมพ์ มันสามารถใช้ในการแสดงออกคงที่ได้ก็ต่อเมื่อตัวมันมีการขยายตัวคงที่
- [FLT: 0] การลดความยุ่งยาก : Macros ขยายตัวก่อนที่ผู้รวบรวมจะเห็นข้อความผิดพลาดหมายถึงรหัสที่ขยายออกไป ไม่ใช่ชื่อแมโคร การใช้ธง [FLT: 28] กับ GPC หรือ CLNK (อังกฤษ) [FLT: 29] แสดงถึงผลลัพธ์ที่ออกมาก่อนการประมวลผล
ทาง เลือก ของ มา คอ โร โร: คอน ท์, แอ นั่ม, และ อิน ไลน์ฟังก์ชัน
ซี ใน ปัจจุบัน ให้ ทาง เลือก ที่ ปลอด ภัย กว่า ซึ่ง บ่อย ครั้ง จะ ขจัด ความ จําเป็น ที่ ต้อง มี เมกะ:
- [FLT: 0]] ตัวแปร: สําหรับค่าคงที่ตัวเลข, ชอบ [FLT: 31] พวกเขามีประเภทการตรวจสอบและทําความเคารพอย่างเหมาะสม อย่างไรก็ตาม พวกมันไม่ใช่ค่าคงที่แบบรวม (E.g. values in C90). ใน C99 และต่อมา สามารถนําไปใช้สําหรับอาร์เรย์ได้หากตัวแปรนั้นคงที่อย่างแท้จริง (FLT: [LT]. [L].
- [FLT: 0]: สําหรับชุดค่าคงที่จํานวนเต็มที่เกี่ยวข้อง, เอนนัมคือประเภทปลอดภัย และกําหนดค่าโดยอัตโนมัติ โดยมันถูกใช้อย่างแพร่หลายกับรหัสข้อผิดพลาดและธง
- [FLT: 0] ) ฟังก์ชันอินไลน์: กํากับใน C99 จัดทําผลงานของแมโครแบบเต็มรูปแบบ ความปลอดภัยเต็มรูปแบบ, การดีบั๊ก, และหลีกเลี่ยงปัญหาด้านที่มีผลต่อด้าน. ตัวอย่างเช่น:
static inline int square(int x) {
return x * x;
}
ใช้ฟังก์ชันในบรรทัด เมื่อไรก็ตามที่คุณต้องการ ขนาดคล้ายฟังก์ชัน ที่ประเมินค่าอาร์กิวเมนต์ได้อย่างถูกต้องครั้งเดียว ตัวที่ใช้ที่เหลือสําหรับฟังก์ชันแบบแมโคร คือเมื่อคุณจําเป็นต้องประมวลผลชนิด (เช่น พิมพ์ของ GND C) หรือต้องการความสามารถในการเปิดขอบเขตใหม่ (เช่น การใช้ร่วมกับกลุ่มย่อย)
ตัวอย่างโลก: การดีบั๊กและการปรับแต่ง
มา คอ รส เลิศ ใน สถานการณ์ ที่ มี เงื่อนไข.
การดีบั๊กการบันทึกด้วยการควบคุมเวลาแบบคอมโพเนลล์
#ifdef DEBUG
#define LOG(fmt, ...) fprintf(stderr, "[DEBUG] " fmt, ##__VA_ARGS__)
#else
#define LOG(fmt, ...) /* no-op */
#endif
ปูมบันทึกของเมกะทรอนนี้เมื่อคอมไพล์ และมาโครเมียที่ว่างเปล่าจะทําให้ค่าใช้จ่ายที่ออกมาเป็นศูนย์ในการสร้าง ก่อน จะเป็นการขยาย เป็นส่วนขยายแบบ GNF ที่เอาเครื่องหมาย Passing trues เมื่อไม่มีอาร์กิวเมนต์สนับสนุนใน C20 ด้วย .
การเข้ารหัสแบบแพลตฟอร์ม
#if defined(_WIN32) || defined(_WIN64)
#define PLATFORM "Windows"
#elif defined(__linux__)
#define PLATFORM "Linux"
#else
#define PLATFORM "Unknown"
#endif
รูปแบบนี้แยกการขึ้นต่อกันของแพลตฟอร์มโดยไม่ทําให้ฟังก์ชั่นทั้งหมดถูกย่อหาย ร่วมกับ (FLT:43) ยามรักษาหัวและรักษาหัวให้สะอาด
รูปแบบการวน
Macros ยังคงเครื่องมือที่ขาดไม่ได้ใน C สําหรับโค้ดความทนทานและบํารุงรักษา โดยเฉพาะในบริบทที่มีประสิทธิภาพหรือฝังตัวตามระยะที่ทุกรอบนับได้ถูกต้อง -- ด้วยวงเล็บที่พอดี, ผลกระทบด้านบาง, และชื่อที่เหมาะสม -- พวกเขาลดการจําลองและปรับค่าเป็นศูนย์กลาง อย่างไรก็ตาม แนวโน้มใน C ปัจจุบันคือ การแทนที่ฟังก์ชันที่คล้ายคลึงกันด้วยฟังก์ชันหรือทั่วไป (FLT: TA) เพื่อเพิ่มระดับความปลอดภัยแบบพิมพ์และความยืดหยุ่นของวัตถุ สําหรับ [FTLL] เป็นต้น [FLL] และ VC: [TL] มักจะดีกว่า
โดยปรับกําลังแบบแมโครตามแบบฉบับให้พอดีกับตัวเลือกที่ปลอดภัยกว่านี้ คุณสามารถเขียนรหัส C ที่มีประสิทธิภาพและแข็งแรงได้ทั้งในการอ่านเพิ่มเติม ดูเพิ่มที่ [FLT: 0]. สืบค้น [FLTIU Ctrlucors [FTL:1]] และ. การอ้างอิงของโควตา (FLT: 3). การเข้าใจรายละเอียดนี้ยังเป็นโครง คุณสามารถช่วยวิกิพีเดียได้โดยเพิ่มข้อมูลการขยายภาพ ดูเพิ่มที่โครงการวิกิกีฬา (FLT: 4) บทความ [FTLTL: 5].