ในC / C ++
เกิดอะไรขึ้นกับรหัสที่วางระหว่าง#if 0
/ #endif
บล็อก
#if 0
//Code goes here
#endif
โค้ดถูกข้ามไปและไม่ถูกเรียกใช้งานใช่หรือไม่?
ในC / C ++
เกิดอะไรขึ้นกับรหัสที่วางระหว่าง#if 0
/ #endif
บล็อก
#if 0
//Code goes here
#endif
โค้ดถูกข้ามไปและไม่ถูกเรียกใช้งานใช่หรือไม่?
คำตอบ:
ไม่เพียง แต่ไม่ได้รับการดำเนินการ แต่ยังไม่ได้รวบรวม
#if
เป็นคำสั่งพรีโปรเซสเซอร์ซึ่งได้รับการประเมินก่อนขั้นตอนการคอมไพล์จริง รหัสภายในบล็อกนั้นจะไม่ปรากฏในไบนารีที่คอมไพล์
มักใช้เพื่อลบส่วนของโค้ดชั่วคราวโดยมีจุดประสงค์เพื่อเปิดใช้งานในภายหลัง
เหมือนกับการแสดงความคิดเห็นในบล็อกยกเว้นข้อแตกต่างที่สำคัญประการหนึ่ง: การทำรังไม่ใช่ปัญหา พิจารณารหัสนี้:
foo();
bar(x, y); /* x must not be NULL */
baz();
หากฉันต้องการแสดงความคิดเห็นฉันอาจลอง:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt ข้อผิดพลาดทางไวยากรณ์! ทำไม? เนื่องจากบล็อกความคิดเห็นไม่ซ้อนกันดังนั้น (ดังที่คุณเห็นจากการเน้นไวยากรณ์ของ SO) */
หลังจากคำว่า "NULL" จะยุติความคิดเห็นทำให้การbaz
โทรไม่แสดงความคิดเห็นและข้อผิดพลาด*/
หลังbaz
ไวยากรณ์ ในทางกลับกัน:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
ทำงานเพื่อแสดงความคิดเห็นทั้งหมด และ#if 0
s จะทำรังซึ่งกันและกันดังนี้:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
แม้ว่าสิ่งนี้จะทำให้สับสนเล็กน้อยและปวดหัวในการบำรุงรักษาหากไม่ได้แสดงความคิดเห็นอย่างถูกต้อง
foo.c:3: unterminated string or character constant
มาจาก gcc ใช้อะไรครับ?
มันแสดงความคิดเห็นอย่างถาวรกับโค้ดนั้นดังนั้นคอมไพเลอร์จะไม่คอมไพล์
โค้ดเดอร์สามารถเปลี่ยน #ifdef เพื่อให้โค้ดนั้นคอมไพล์ในโปรแกรมได้ในภายหลังหากต้องการ
มันเหมือนกับว่าไม่มีรหัส
บล็อก #if 0 … #endif ทำหน้าที่อะไร
มันบอกคุณว่าผู้เขียนไม่เคยได้ยินเกี่ยวกับระบบควบคุมเวอร์ชัน ซึ่งจะบอกให้คุณวิ่งให้ไกลที่สุด ...
ฉันต้องการเพิ่มสำหรับ#else
กรณี:
#if 0
/* Code here will NOT be complied. */
#else
/* Code will be compiled. */
#endif
#if 1
/* Code will be complied. */
#else
/* Code will NOT be compiled. */
#endif
เมื่อตัวประมวลผลล่วงหน้าเห็น # หากตรวจสอบว่าโทเค็นถัดไปมีค่าที่ไม่ใช่ศูนย์หรือไม่ ถ้าเป็นเช่นนั้นจะคงรหัสไว้สำหรับคอมไพเลอร์ หากไม่เป็นเช่นนั้นระบบจะกำจัดรหัสนั้นออกเพื่อให้คอมไพเลอร์ไม่เห็น
หากมีคนพูดว่า #if 0 พวกเขากำลังแสดงความคิดเห็นเกี่ยวกับโค้ดอย่างมีประสิทธิภาพดังนั้นจะไม่มีการคอมไพล์ คุณสามารถคิดว่าสิ่งนี้เหมือนกับว่าพวกเขาใส่ / * ... * / รอบ ๆ มัน มันไม่เหมือนกัน แต่ก็มีผลเหมือนกัน
หากคุณต้องการทำความเข้าใจกับสิ่งที่เกิดขึ้นโดยละเอียดคุณสามารถดูได้ คอมไพเลอร์จำนวนมากจะอนุญาตให้คุณเห็นไฟล์หลังจากที่ตัวประมวลผลล่วงหน้าทำงานแล้ว ตัวอย่างเช่นบน Visual C ++ คำสั่ง switch / P จะเรียกใช้ตัวประมวลผลล่วงหน้าและใส่ผลลัพธ์ในไฟล์. i
#if WIN32 || __CYGWIN__
แต่มันได้ผลตามที่คาดไว้
เส้นที่เริ่มต้นด้วยการ#
มีคำสั่ง preprocessor #if 0 [...] #endif
บล็อกไม่ส่งไปยังคอมไพเลอร์และจะไม่สร้างรหัสเครื่อง
คุณสามารถสาธิตสิ่งที่เกิดขึ้นกับตัวประมวลผลล่วงหน้าด้วยไฟล์ต้นฉบับifdef.cxx
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
การรันgcc -E ifdef.cxx
จะแสดงสิ่งที่รวบรวม
คุณอาจเลือกที่จะใช้กลไกนี้เพื่อป้องกันไม่ให้บล็อกโค้ดถูกคอมไพล์ในระหว่างรอบการพัฒนา แต่คุณอาจไม่ต้องการตรวจสอบโค้ดในการควบคุมซอร์สของคุณเนื่องจากเพียงแค่เพิ่มปมให้กับโค้ดของคุณและลดความสามารถในการอ่าน หากเป็นส่วนของรหัสทางประวัติศาสตร์ที่มีการแสดงความคิดเห็นแล้วควรลบออก: การควบคุมแหล่งที่มามีประวัติใช่ไหม
นอกจากนี้คำตอบอาจเหมือนกันสำหรับทั้งCและC ++แต่ไม่มีภาษาที่เรียกว่า C / C ++ และไม่ใช่นิสัยที่ดีที่จะอ้างถึงภาษาดังกล่าว
ไม่มาก
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
มันแสดง "tc: 4: 19: warning: ไม่มีการยุติ" character "ด้วย gcc 4.2.4
เป็นวิธีที่ถูกในการแสดงความคิดเห็น แต่ฉันสงสัยว่าอาจมีโอกาสในการดีบัก ตัวอย่างเช่นสมมติว่าคุณมีบิลด์ที่ส่งออกค่าไปยังไฟล์ คุณอาจไม่ต้องการสิ่งนั้นในเวอร์ชันสุดท้ายเพื่อให้คุณสามารถใช้ #if 0 ... #endif
นอกจากนี้ฉันสงสัยว่าวิธีที่ดีกว่าในการทำเพื่อจุดประสงค์ในการดีบักคือทำ:
#ifdef DEBUG
// output to file
#endif
คุณสามารถทำอะไรแบบนั้นได้และมันอาจจะเข้าท่ากว่าและสิ่งที่คุณต้องทำคือกำหนด DEBUG เพื่อดูผลลัพธ์
//
หรือเริ่มต้นส่วนที่มีและจบส่วนที่มี/*
*/
ปัญหาของเทคนิคหลังคือความคิดเห็นไม่ซ้อนกันดังนั้นนักพัฒนาต้องตรวจสอบและจัดการใด ๆ*/
ระหว่างจุดเริ่มต้นและจุดสิ้นสุด