#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
ในการนี้สิ่งที่เป็นบทบาทของ#ifdefและ#ifndefและสิ่งที่ส่งออกหรือไม่
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
ในการนี้สิ่งที่เป็นบทบาทของ#ifdefและ#ifndefและสิ่งที่ส่งออกหรือไม่
คำตอบ:
ข้อความภายในifdef/endifหรือifndef/endif คู่จะถูกทิ้งไว้ในหรือลบโดยตัวประมวลผลล่วงหน้าขึ้นอยู่กับเงื่อนไข ifdefหมายถึง "ถ้ามีการกำหนดสิ่งต่อไปนี้" ในขณะที่ifndefหมายถึง "หากไม่ได้กำหนดสิ่งต่อไปนี้"
ดังนั้น:
#define one 0
#ifdef one
printf("one is defined ");
#endif
#ifndef one
printf("one is not defined ");
#endif
เทียบเท่ากับ:
printf("one is defined ");
เนื่องจากoneถูกกำหนดให้ifdefเป็นจริงและifndefเป็นเท็จ ไม่สำคัญว่าจะถูกกำหนดให้เป็นอย่างไร โค้ดที่คล้ายกัน (ดีกว่าในความคิดของฉัน) คือ:
#define one 0
#ifdef one
printf("one is defined ");
#else
printf("one is not defined ");
#endif
เนื่องจากเป็นการระบุเจตนาที่ชัดเจนยิ่งขึ้นในสถานการณ์เฉพาะนี้
ในกรณีเฉพาะของคุณข้อความหลังifdefไม่ถูกลบออกตั้งแต่oneถูกกำหนดไว้ ข้อความหลังจากที่ifndef ถูกลบออกด้วยเหตุผลเดียวกัน จะต้องมีสองendifบรรทัดปิดในบางจุดและบรรทัดแรกจะทำให้เกิดการรวมบรรทัดอีกครั้งดังนี้:
#define one 0
+--- #ifdef one
| printf("one is defined "); // Everything in here is included.
| +- #ifndef one
| | printf("one is not defined "); // Everything in here is excluded.
| | :
| +- #endif
| : // Everything in here is included again.
+--- #endif
ใครบางคนควรพูดถึงว่าในคำถามมีกับดักเล็กน้อย #ifdefจะตรวจสอบว่าสัญลักษณ์ต่อไปนี้ถูกกำหนดผ่าน#defineหรือตามบรรทัดคำสั่งเท่านั้น แต่ค่าของมัน (การแทนที่ในความเป็นจริง) ไม่เกี่ยวข้อง คุณสามารถเขียน
#define one
precompilers ยอมรับว่า แต่ถ้าใช้#ifก็เป็นอีกอย่าง
#define one 0
#if one
printf("one evaluates to a truth ");
#endif
#if !one
printf("one does not evaluate to truth ");
#endif
จะให้one does not evaluate to truth. คีย์เวิร์ดdefinedช่วยให้ได้พฤติกรรมที่ต้องการ
#if defined(one)
จึงเทียบเท่ากับ #ifdef
ข้อดีของ#ifโครงสร้างคือเพื่อให้สามารถจัดการเส้นทางรหัสได้ดีขึ้นลองทำอะไรแบบนั้นกับคู่#ifdef/ #ifndefคู่เก่า
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
"#if one" หมายความว่าถ้า "#define one" ถูกเขียน "#if one" มิฉะนั้นจะดำเนินการ "#ifndef one"
นี่เป็นเพียงคำสั่ง C Pre-Processor (CPP) ที่เทียบเท่ากับคำสั่ง if จากนั้นคำสั่ง branch ในภาษา C
เช่นถ้า {#define one} แล้ว printf ("หนึ่งประเมินเป็นความจริง"); else printf ("ไม่ได้กำหนดไว้"); ดังนั้นหากไม่มี #define หนึ่งคำสั่งสาขาอื่นของคำสั่งจะถูกดำเนินการ
โค้ดดูแปลก ๆ เนื่องจาก printf ไม่อยู่ในบล็อคฟังก์ชันใด ๆ