บทบาทของ #ifdef และ #ifndef


100
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

ในการนี้สิ่งที่เป็นบทบาทของ#ifdefและ#ifndefและสิ่งที่ส่งออกหรือไม่

คำตอบ:


131

ข้อความภายใน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

68

ใครบางคนควรพูดถึงว่าในคำถามมีกับดักเล็กน้อย #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

0

"#if one" หมายความว่าถ้า "#define one" ถูกเขียน "#if one" มิฉะนั้นจะดำเนินการ "#ifndef one"

นี่เป็นเพียงคำสั่ง C Pre-Processor (CPP) ที่เทียบเท่ากับคำสั่ง if จากนั้นคำสั่ง branch ในภาษา C

เช่นถ้า {#define one} แล้ว printf ("หนึ่งประเมินเป็นความจริง"); else printf ("ไม่ได้กำหนดไว้"); ดังนั้นหากไม่มี #define หนึ่งคำสั่งสาขาอื่นของคำสั่งจะถูกดำเนินการ


4
ฉันไม่แน่ใจว่าสิ่งนี้เพิ่มอะไรที่คำตอบอื่น ๆ ยังไม่ครอบคลุมและตัวอย่างของคุณไม่ใช่ C หรือ C ++
SirGuy

-2

โค้ดดูแปลก ๆ เนื่องจาก printf ไม่อยู่ในบล็อคฟังก์ชันใด ๆ


1
ทั้งบล็อกสามารถอยู่ภายในฟังก์ชันได้ และยินดีต้อนรับสู่ stackoverflow โปรดอ่านstackoverflow.com/help/how-to-answer
rajashekar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.