#if และ # กำหนด MY_MACRO (0)
การใช้ #if หมายความว่าคุณได้สร้างมาโคร "กำหนด" นั่นคือสิ่งที่จะค้นหาในโค้ดที่จะถูกแทนที่ด้วย "(0)" นี่คือ "มาโครนรก" ที่ฉันไม่อยากเห็นใน C ++ เพราะมันทำให้โค้ดเสียหายด้วยการแก้ไขโค้ดที่อาจเกิดขึ้น
ตัวอย่างเช่น:
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
ให้ข้อผิดพลาดต่อไปนี้ใน g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
เพียงหนึ่งเดียวข้อผิดพลาด
ซึ่งหมายความว่าแมโครของคุณโต้ตอบกับรหัส C ++ ของคุณสำเร็จ: การเรียกใช้ฟังก์ชันสำเร็จ ในกรณีง่ายๆนี้มันน่าขบขัน แต่ประสบการณ์ของฉันเองกับการเล่นมาโครอย่างเงียบ ๆ ด้วยรหัสของฉันนั้นไม่ได้เต็มไปด้วยความสุขและความสมบูรณ์ดังนั้น ...
#ifdef และ #define MY_MACRO
การใช้ #ifdef หมายความว่าคุณ "กำหนด" บางอย่าง ไม่ใช่ว่าคุณให้ค่ามัน มันยังคงก่อมลพิษ แต่อย่างน้อยมันจะถูก "แทนที่ด้วยอะไร" และโค้ด C ++ จะไม่ถูกมองว่าเป็นคำสั่งรหัสที่ล้าสมัย รหัสเดียวกันด้านบนด้วยการกำหนดง่ายๆมัน:
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
ให้คำเตือนต่อไปนี้:
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
ดังนั้น...
สรุป
ฉันอยากใช้ชีวิตโดยไม่มีมาโครในโค้ดของฉัน แต่ด้วยเหตุผลหลายประการ (การกำหนดส่วนป้องกันส่วนหัวหรือมาโครการแก้ไขข้อบกพร่อง) ฉันทำไม่ได้
แต่อย่างน้อยฉันต้องการให้พวกเขาโต้ตอบน้อยที่สุดเท่าที่จะเป็นไปได้ด้วยรหัส C ++ ที่ถูกต้องของฉัน ซึ่งหมายถึงการใช้ #define โดยไม่มีค่าโดยใช้ #ifdef และ #ifndef (หรือแม้กระทั่ง #if ที่กำหนดตามที่ Jim Buck แนะนำ) และที่สำคัญที่สุดคือการตั้งชื่อให้ยาวมากและคนต่างด้าวจะไม่มีใครในความคิดที่ถูกต้องของเขา / เธอใช้ "โดยบังเอิญ" และจะไม่มีผลต่อรหัส C ++ ที่ถูกต้องตามกฎหมาย
โพสต์ Scriptum
ตอนนี้ฉันกำลังอ่านโพสต์ของฉันอีกครั้งฉันสงสัยว่าฉันไม่ควรพยายามหาค่าบางอย่างที่ไม่เคยถูกต้อง C ++ เพื่อเพิ่มในการกำหนดของฉัน สิ่งที่ต้องการ
#define MY_MACRO @@@@@@@@@@@@@@@@@@
ที่สามารถใช้กับ #ifdef และ #ifndef ได้ แต่อย่าให้โค้ดคอมไพล์หากใช้ภายในฟังก์ชัน ... ฉันลองสิ่งนี้สำเร็จบน g ++ และทำให้เกิดข้อผิดพลาด:
main.cpp|410|error: stray ‘@’ in program|
น่าสนใจ. :-)
#if
คุณสามารถใช้#elif
ในลักษณะที่สอดคล้องกันได้ซึ่งแตกต่างจาก#ifdef
ไฟล์. ดังนั้นแทนที่จะใช้เพียง#define BLAH
ใช้#define BLAH 1
กับ#if BLAH
ฯลฯ ...