ระวังถูก compiler หลอก (1) เคยเห็นกระทู้ถามปัญหาภาษา C ในพันทิปกระทู้นึง เจ้าของกระทู้เอา source code ที่สงสัยมาให้ดู ผมเห็นว่า source code ที่ให้มา ไม่น่าจะ compile ผ่าน แต่คำถามที่เจ้าของกระทู้ถาม แสดงว่าได้ทดลอง compile มาแล้ว code ที่ผมคิดว่าไม่น่าจะ compile ผ่านคือ srand(unsigned(time(NULL))); ตรง unsigned(time(NULL)) เข้าใจว่าเป็นการ cast ค่าที่ return มาจาก function time ให้เป็น unsigned แต่ syntax การ cast ในภาษา C ต้องใส่วงเล็บด้วย ดังนั้นตรง unsigned ต้องเป็น (unsigned) code ที่ถูก ต้องเป็นแบบนี้ครับ srand((unsigned)(time(NULL))); ด้วยความสงสัยก็เลยลองเอา code ที่ผิด ไป compile ด้วย gcc บน linux ผลลัพธ์เป็นไปตามที่คาด คือ compile ไม่ผ่านครับ แต่นึกได้ว่ามี compiler อีกตัวชื่อ Dev-C ที่พึ่ง download มา เลยลองเอามา compile ดู คราวนี้ปรากฎว่า compile ผ่าน ทำเอาผมงงไปเลยครับ ความคิดแรกที่แว่บเข้ามาคือผมต้องทำอะไรผิด หรือเข้าใจอะไรผิด แน่ๆ ตอน download Dev-C จาก web site ก็เห็นว่าใช้ compiler ของ gnu ไม่น่าจะมีปัญหาเรื่อง standard เลยหาดูว่า Dev-C ใช้ compiler ตัวไหน ไปเห็นว่าใช้ g++ อยู่ ซึ่ง g++ เป็น compiler สำหรับภาษา C++ ไม่ใช่ compiler สำหรับภาษา C ผมลองแก้ให้ใช้ gcc เป็น compiler ผลปรากฏว่า compile ไม่ผ่าน แสดงว่าถ้าเอา source code ภาษา C ไป compile ด้วย compiler สำหรับภาษา C++ อาจได้ผลลัพธ์ผิดๆ เพราะถูก compiler หลอกเอาได้ ยังมีตัวอย่างที่ถูก compiler หลอกอีกหลายตัวอย่าง เอาไว้มีเวลาจะมาเล่าให้ฟังอีกครับ ผมเคยเหมือนกัน อาการคล้าย ๆ แบบนี้ แต่ของผมดันเอาส่วนที่ comment ไป compile ซะงั้น C18 ของ Microchip แก้ไปครึ่งวันกว่าจะหาสาเหตุได้
โดย: AIam วันที่: 14 สิงหาคม 2551 เวลา:0:59:08 น.
ของคุณ AIam อาจเป็นที่ nested comment คือมี comment อยู่ใน comment อีกที
ใน standard ภาษา C จะไม่ยอมให้มี nested comment ครับ แต่ compiler บางตัวอาจยอมให้มีได้ โดย: zkaru วันที่: 14 สิงหาคม 2551 เวลา:7:52:13 น.
|
ม่ายรู้เิรื่องเลย ค่ะ
เพิ่งรู้ตัวว่าั Yahoo360, มานเอางานของเราเก่าๆที่เขียนหายเหลือแค่ไม่กี่เหน้า