ไม่ไม่มีวิธีพกพาในการทำเช่นนั้น จากนั้นอีกครั้งไม่มีวิธีพกพาในการใช้ #pragma เลย ด้วยเหตุนี้คอมไพเลอร์ C / C ++ จำนวนมากจึงกำหนดวิธีการของตนเองในการทำสิ่งที่เหมือนปราม่าและมักจะฝังอยู่ในมาโครได้ แต่คุณต้องมีนิยามมาโครที่แตกต่างกันในทุกคอมไพเลอร์ หากคุณยินดีที่จะไปเส้นทางนั้นคุณมักจะทำสิ่งนี้:
#if defined(COMPILER_GCC)
#define Weak_b
#define Weak_e __attribute__((weak))
#elif defined(COMPILER_FOO)
#define Weak_b __Is_Weak
#define Weak_e
#endif
#define DEFINE_DELETE_OBJECT(type) \
Weak_b void delete_ ## type_(int handle) Weak_e; \
Weak_b void delete_ ## type(int handle) Weak_e;
ในกรณีที่ไม่ชัดเจนคุณต้องการกำหนดWeak_b
และWeak_e
เป็นโครงสร้างการถ่ายคร่อมเริ่มต้นและสิ้นสุดเนื่องจากคอมไพเลอร์บางตัวเช่น GCC เพิ่มแอตทริบิวต์เป็นส่วนเสริมในลายเซ็นประเภทและบางส่วนเช่น MSC เพิ่มเป็นคำนำหน้า (หรืออย่างน้อยก็ทำ ครั้งหนึ่งเป็นเวลาหลายปีแล้วที่ฉันใช้ MSC) การมีโครงร่างคร่อมช่วยให้คุณสามารถกำหนดสิ่งที่ใช้ได้ผลเสมอแม้ว่าคุณจะต้องส่งลายเซ็นประเภททั้งหมดไปยังโครงสร้างคอมไพเลอร์
แน่นอนว่าหากคุณลองย้ายสิ่งนี้ไปยังคอมไพเลอร์โดยไม่มีแอตทริบิวต์ที่คุณต้องการคุณก็ไม่สามารถทำอะไรได้นอกจากปล่อยให้มาโครขยายไปเรื่อย ๆ และหวังว่าโค้ดของคุณจะยังคงทำงานอยู่ ในกรณีของการเตือนอย่างหมดจดหรือการเพิ่มประสิทธิภาพ pragmas อาจเป็นไปได้ ในกรณีอื่น ๆ ไม่มาก
โอ้ฉันสงสัยว่าคุณต้องกำหนด Weak_b และ Weak_e เป็นมาโครที่ใช้พารามิเตอร์ แต่ฉันไม่เต็มใจที่จะอ่านเอกสารเกี่ยวกับวิธีสร้างคำจำกัดความที่อ่อนแอสำหรับตัวอย่างนี้ ฉันฝากไว้เป็นแบบฝึกหัดสำหรับผู้อ่าน