ตัวอย่างเช่นฉันเพิ่งเจอสิ่งนี้ในเคอร์เนล linux:
/ * บังคับให้เกิดข้อผิดพลาดในการคอมไพล์หากเงื่อนไขเป็นจริง * / #define BUILD_BUG_ON (เงื่อนไข) ((โมฆะ) sizeof (ถ่าน [1 - 2 * !! (เงื่อนไข)]))
ดังนั้นในโค้ดของคุณหากคุณมีโครงสร้างบางอย่างที่ต้องมีให้พูดขนาดหลาย ๆ 8 ไบต์อาจเป็นเพราะข้อ จำกัด ของฮาร์ดแวร์คุณสามารถทำได้:
BUILD_BUG_ON ((sizeof (โครงสร้างของโครงสร้าง)% 8)! = 0);
และจะไม่คอมไพล์เว้นแต่ขนาดของ struct mystruct จะเป็นผลคูณของ 8 และถ้าเป็นผลคูณของ 8 จะไม่มีการสร้างโค้ดรันไทม์เลย
เคล็ดลับอีกประการหนึ่งที่ฉันรู้มาจากหนังสือ "Graphics Gems" ซึ่งอนุญาตให้ไฟล์ส่วนหัวเดียวสามารถประกาศและเริ่มต้นตัวแปรในโมดูลเดียวในขณะที่โมดูลอื่น ๆ ที่ใช้โมดูลนั้นเพียงแค่ประกาศเป็นภายนอกเท่านั้น
#ifdef DEFINE_MYHEADER_GLOBALS # กำหนดทั่วโลก # กำหนด INIT (x, y) (x) = (y) #อื่น #define GLOBAL extern # กำหนด INIT (x, y) #endif GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
ด้วยเหตุนี้รหัสที่กำหนด x และ somefunc จึงทำดังนี้
# กำหนด DEFINE_MYHEADER_GLOBALS # รวม "the_above_header_file.h"
ในขณะที่รหัสที่ใช้ x และ somefunc () ทำ:
# รวม "the_above_header_file.h"
ดังนั้นคุณจะได้รับไฟล์ส่วนหัวหนึ่งไฟล์ที่ประกาศทั้งอินสแตนซ์ของ globals และฟังก์ชันต้นแบบที่ต้องการและการประกาศภายนอกที่เกี่ยวข้อง
ดังนั้นเทคนิคการเขียนโปรแกรม C ที่คุณชื่นชอบในบรรทัดเหล่านี้คืออะไร?