#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 ไม่อยู่ในบล็อคฟังก์ชันใด ๆ