สวัสดีและยินดีต้อนรับกลับ
ในการบรรยายนี้ ฉันแค่อยากจะพูดถึงคอมไพเลอร์และคำเตือนทั่วไป
เราพูดถึงปัญหาทั่วไปของค
แต่บางครั้งคุณไม่รู้ด้วยซ้ำว่าคุณมีข้อผิดพลาดในโปรแกรมของคุณเมื่อคอมไพเลอร์พยายามบอกคุณ
ข้อผิดพลาดและคำเตือนของคอมไพเลอร์มักจะคลุมเครือสำหรับโปรแกรมเมอร์มือใหม่
พวกเขาอาจกำลังบอกคุณว่าคุณไม่มีอัฒภาค แต่ข้อความแจ้งว่าเข้าถึงไม่ได้
และสำหรับคนใหม่ พวกเขาอาจไม่รู้ด้วยซ้ำว่านั่นหมายถึงอะไร
ดังนั้นจึงต้องใช้การฝึกฝนอย่างมากในการเขียนโค้ดจำนวนมากและเพื่อถอดรหัสคำเตือนของคอมไพเลอร์เหล่านี้เมื่อเวลาผ่านไป
แต่ขอบอกไว้ก่อนว่า
ดังนั้น ปัญหาทั่วไปบางส่วนที่คุณเห็นในการบรรยายครั้งก่อน ฉันจะอธิบายเกี่ยวกับคำเตือนและข้อผิดพลาดของคอมไพเลอร์
และสิ่งที่มันจะพูดจริงๆ
เป็นเรื่องสำคัญมากที่จะต้องบอกคุณให้เข้าใจสิ่งที่คอมไพเลอร์กำลังบอกคุณ
หากคอมไพเลอร์กำลังบอกคุณว่ามีข้อผิดพลาด แต่คุณไม่เข้าใจข้อผิดพลาดนั้น
คุณจะต้องใช้เวลานานกว่ามากในการแก้ไขโค้ดนั้น
แต่ถ้าคุณเห็นข้อผิดพลาดและคุณรู้ว่ามันพูดว่าอะไร
คุณก็ไปแก้ไขได้ทันที
ฉันจำได้ว่า ฉันจะอยู่ในแล็บเมื่อเริ่มเขียนโปรแกรมครั้งแรก
และฉันจะพลาดอัฒภาคซึ่งเป็นเรื่องธรรมดามาก
และคอมไพเลอร์จะบอกว่าฉันไม่มีเครื่องหมายอัฒภาค
แต่ฉันไม่รู้ว่ามันจะบอกว่าสิ้นสุดคำสั่งที่เข้าถึงไม่ได้ และฉันก็แบบว่า สิ่งนั้นหมายความว่าอย่างไร
คำสั่งคืออะไร ฉันคงสับสนมาก
นั่นเป็นเหตุผลที่ฉันต้องการให้คำแนะนำแก่คุณเกี่ยวกับสิ่งที่คอมไพเลอร์พยายามจะบอกคุณ
ดังนั้นจึงเป็นเรื่องยากมากที่จะเข้าใจว่าคอมไพเลอร์บ่นเกี่ยวกับอะไร
ในการถอดรหัสข้อความเหล่านี้บางครั้งอาจสร้างความสับสน
ดังนั้นคุณต้องเข้าใจข้อผิดพลาดของคอมไพเลอร์เหล่านี้เพื่อแก้ไข ค่อนข้างเป็นพื้นฐาน
และคอมไพเลอร์ทำงานให้คุณครึ่งหนึ่ง
มันกำลังตรวจสอบไวยากรณ์ บอกคุณอย่างชัดเจนว่ามีอะไรผิดปกติ
ดังนั้นคุณควรใช้มันให้เป็นประโยชน์
แต่บางครั้งมันก็ยากที่จะเข้าใจอย่างถ่องแท้ว่ากำลังพูดอะไร โดยเฉพาะอย่างยิ่งถ้าคุณยังใหม่อยู่และคุณไม่เข้าใจคำศัพท์บางคำ
คอมไพเลอร์ทำการตัดสินใจเกี่ยวกับวิธีการแปลโค้ดของคุณที่โปรแกรมเมอร์ไม่ได้เขียนไว้ในโค้ด
ซึ่งสะดวกสำหรับโปรแกรมและคอมไพเลอร์ เพื่อให้สามารถเขียนได้กระชับยิ่งขึ้น
และมีเพียงโปรแกรมเมอร์ผู้เชี่ยวชาญเท่านั้นที่ใช้ประโยชน์จากคุณลักษณะนี้
สิ่งที่ฉันบอกคุณคือเมื่อคุณคอมไพล์ คุณควรใช้ตัวเลือก
dash wall เสมอ
สิ่งนี้จะเปิดทุกอย่าง
ดังนั้นในบางครั้ง คุณลักษณะที่ล้ำหน้ากว่านั้นก็คือ
คุณจะต้องนำบางสิ่งออกไป
ให้การแปลมีประสิทธิภาพมากขึ้นเล็กน้อย
แต่เมื่อคุณเพิ่มเข้าไป
แสดงว่าคุณทำให้โปรแกรมคอมไพล์แตกต่างกัน
ด้วยเหตุนี้ คุณอาจมีคำเตือนในโค้ดที่คุณไม่ทราบ
เหตุผลที่ฉันบอกคุณว่าคุณต้องการคอมไพล์ด้วยตัวเลือกใดตัวเลือกหนึ่งเสมอ
ซึ่งก็คือตัวเลือกแดชวอลล์
และโดยค่าเริ่มต้นคุณจะถูกเปิดใช้งานในบล็อคโค้ด
และจะแจ้งให้คุณทราบทุกกรณีที่คอมไพเลอร์กำลังทำสิ่งที่คุณไม่รู้
นอกจากนี้ยังจะเปิดคำเตือนทั้งหมด ให้ข้อมูลมากมาย
มันเป็นตัวเลือกคอมไพเลอร์ที่มีประโยชน์มาก
เมื่อคุณมีตัวเลือกดังกล่าวแล้ว คุณสามารถพยายามช่วยให้คุณเข้าใจสิ่งที่คอมไพเลอร์กำลังบอกคุณได้ดียิ่งขึ้น
ดังนั้นคอมไพเลอร์จะแสดงปัญหาสองประเภทให้คุณเห็น
หนึ่งคือความผิดพลาด
สิ่งนี้จะป้องกันการสร้างโปรแกรมได้จริง
คุณมีข้อผิดพลาดทางไวยากรณ์และไม่สามารถคอมไพล์โปรแกรมได้
ไม่มีงานปฏิบัติการที่สร้างขึ้นใหม่และ
โดยปกติ
เมื่อคุณเห็นข้อผิดพลาดจากคอมไพเลอร์ คุณต้องการเน้นที่ข้อผิดพลาดแรกนั้นเสมอ
นั่นเป็นข้อผิดพลาดที่น่าเชื่อถือที่สุดเนื่องจากข้อผิดพลาดอื่นๆ
บางส่วนอาจเป็นผลมาจากข้อผิดพลาดครั้งแรกนั้น
ดังนั้นจงมุ่งความสนใจไปที่ข้อผิดพลาดครั้งแรกนั้นเสมอ แก้ไขข้อผิดพลาดที่ด้านบนก่อน แล้วจึงคอมไพล์อีกครั้งและดูว่าข้อผิดพลาดอื่นๆ
หายไปหรือไม่
คำเตือน คำเตือนคือข้อความที่คอมไพเลอร์แสดงเกี่ยวกับสถานการณ์พิเศษและตรวจพบความผิดปกติบางประเภท
เป็นข้อผิดพลาดที่ไม่ร้ายแรง ดังนั้นโปรแกรมปฏิบัติการจะถูกสร้างขึ้น
แต่ก็ยังเป็นสิ่งที่คุณควรแก้ไข
มีคำเตือนด้วยเหตุผล คุณกำลังทำสิ่งที่ไม่ถูกต้องหรืออาจทำให้เกิดปัญหาได้ในอนาคต
ดังนั้น คุณต้องการแก้ไขคำเตือนทั้งหมดของคุณเสมอ
และการคอมไพล์ด้วยตัวเลือก dash wall คุณไม่ได้พิจารณาว่าโปรแกรมถูกต้องจนกว่าคำเตือนทั้งหมดจะถูกกำจัด
ดังนั้นการรวบรวมจะไม่ล้มเหลว นี่คือเหตุผลที่ฉันบอกให้คุณใช้ตัวเลือกนี้และเห็นทุกอย่างที่เกิดขึ้นโดยคอมไพเลอร์
ดังนั้นข้อความคอมไพเลอร์ทั่วไปบางข้อความที่คุณจะพบ
และสิ่งนี้จะเกี่ยวข้องโดยตรงกับปัญหา c ทั่วไปที่เรากล่าวถึงก่อนหน้านี้
หากตัวแปรไม่ได้รับการประกาศ คุณจะเห็นตัวแปรข้อความนี้ไม่ได้รับการประกาศก่อนโดยใช้ฟังก์ชันนี้
นี่เป็นหนึ่งในสิ่งที่พบได้บ่อยที่สุดและมักจะตรวจพบได้ง่ายกว่า
จากนั้นจะแสดงสัญลักษณ์ก่อนข้อความนี้ด้วย
โดยทั่วไปจะบอกว่าคุณกำลังพยายามใช้ตัวแปรนี้
แต่คุณไม่เคยประกาศมันจริงๆ
เรารู้ว่าเมื่อคุณประกาศตัวแปร คุณต้องระบุประเภทข้อมูล
คุณไม่สามารถเพียงแค่ลงชื่อข้อมูลกับตัวแปรที่ไม่มีอยู่จริง
การเตือนโดยปริยายของการประกาศฟังก์ชัน ซึ่งเกี่ยวข้องกับการประกาศฟังก์ชัน
เมื่อคุณพยายามเรียกใช้ฟังก์ชัน แต่ถ้าฟังก์ชันนั้นไม่มีการใช้งานที่เกี่ยวข้อง
คุณไม่ได้ใส่ส่วนหัวหรือไม่ได้ประกาศไว้
ดังนั้นจึงไม่รู้ว่ามันอยู่ที่ไหน
และไม่รู้ว่าฟังก์ชันถูกประกาศอย่างไร ไม่รู้อาร์กิวเมนต์ ไม่รู้ค่าที่ส่งกลับ
ไม่มีข้อมูลเกี่ยวกับฟังก์ชั่นตัวเอง?
ในการแก้ปัญหานี้ ให้ประกาศต้นแบบฟังก์ชันที่ด้านบนเสมอ
คำเตือนอื่นที่บอกว่าการเตือนการควบคุมถึงจุดสิ้นสุดของฟังก์ชัน non-void
สิ่งนี้จะเกิดขึ้นเมื่อฟังก์ชันถูกกำหนดให้ส่งคืนผลลัพธ์ที่ไม่ใช่โมฆะ
แต่ไม่มีคำสั่ง return รวมอยู่ในฟังก์ชัน
เลยลืมคืนข้อมูล
ฟังก์ชันถูกกำหนดอย่างไม่ถูกต้อง ซึ่งคุณต้องลบชนิดข้อมูลก่อนการประกาศฟังก์ชัน
หรือคุณลืมเพิ่มคำสั่งส่งคืนนั้น
ต้องเปลี่ยนข้อใดข้อหนึ่งเพื่อแก้ไขคำเตือนนี้
แต่คุณเห็นว่านี่เป็นคำเตือน คุณยังสามารถคอมไพล์ที่นั่นได้
แต่คนที่อาจทำให้เกิดปัญหาในโปรแกรมของคุณจริงๆ
หากคุณคาดหวังว่าฟังก์ชันจะส่งคืนบางสิ่งและไม่เป็นเช่นนั้น คุณต้องการแก้ไขคำเตือนที่ไม่ได้ใช้ตัวแปรคำเตือนทั่วไปอื่น
สิ่งนี้ถูกพิมพ์โดยคอมไพเลอร์เมื่อมีการประกาศตัวแปร แต่ไม่เคยใช้
คุณไม่ควรประกาศตัวแปรหากคุณไม่ได้ใช้มัน
ดังนั้นให้ลบการประกาศนั้นออก
ฉันมักจะได้รับสิ่งเหล่านี้เล็กน้อยเมื่อฉันทำการสาธิตบางส่วนเพราะฉันปล่อยให้ตัวแปรที่ฉันไม่เคยใช้
หรือเมื่อฉันสาธิตวิธีประกาศตัวแปรแล้วคอมไพล์เพื่อแสดงให้คุณเห็นว่าคอมไพล์แล้ว
ฉันจะได้รับคำเตือนว่าไม่เคยใช้มาก่อน
ไม่เป็นไรเพราะฉันแสดงให้เห็นอะไรบางอย่าง แต่ให้ลบตัวแปรของคุณออกหากไม่ได้ใช้
ไม่ต้องประกาศ.
ไม่ได้กำหนดการอ้างอิงถึง สิ่งนี้เกิดขึ้นในขั้นตอนการเชื่อมโยง
ดังนั้นจำคอมไพเลอร์หรือขั้นตอนการคอมไพล์ก็จะคอมไพล์
ขั้นแรก มันจะเรียกใช้ตัวประมวลผลล่วงหน้า จากนั้นจะสร้างไฟล์อ็อบเจ็กต์ จากนั้นจึงนำไฟล์อ็อบเจ็กต์เหล่านั้นมาเชื่อมโยงเข้าด้วยกันเพื่อสร้างโปรแกรมที่สมบูรณ์
ดังนั้นในระหว่างขั้นตอนการลิงก์
จำเป็นต้องแก้ไขการพึ่งพาภายนอกใดๆ
หรือเฉพาะฟังก์ชันใด ๆ ที่คุณกำลังเรียกใช้ จะต้องมีการใช้งานที่ไหนสักแห่ง
ดังนั้นถ้ามันไม่มีไฟล์อ็อบเจ็กต์นั้น มันจะให้ปัญหานี้กับคุณ
คุณกำลังพยายามเรียกใช้ฟังก์ชัน แต่เราไม่มีรหัสสำหรับฟังก์ชันนั้น
ดังนั้นคุณต้องแน่ใจว่าคุณลิงก์ไปยังไฟล์นี้
โดยปกติลิงก์จะเกิดขึ้นสำหรับคุณ
แต่ใน GCC คุณสามารถทำตัวเลือก dash l เพื่อเพิ่มไฟล์การลิงก์ได้
ดังนั้น
หากคุณกำลังใช้ฟังก์ชันในไฟล์ส่วนหัวของคณิตศาสตร์ แต่คุณไม่ได้ลิงก์ไปยังไฟล์อ็อบเจกต์คณิตศาสตร์ คุณจะได้รับข้อผิดพลาดนี้
และยังเกิดขึ้นหากคุณกำหนดโดยผู้ใช้และคุณไม่ได้รวมไฟล์ต้นฉบับ
c
ดังนั้นคุณจึงมีไฟล์ต้นฉบับ c หลายไฟล์
หนึ่งในไฟล์ต้นฉบับ c กำลังใช้งานฟังก์ชันนี้
ไฟล์ต้นฉบับ c อื่นรวมส่วนหัวและเรียกมัน
แต่คุณไม่เคยคอมไพล์ไฟล์ต้นฉบับ
c อื่นที่มีการนำไปใช้งาน คุณจะเห็นข้อผิดพลาดนี้
ดังนั้น ตรวจสอบให้แน่ใจว่าคุณได้นำไฟล์ต้นฉบับนั้นเข้ามา ตรวจสอบให้แน่ใจว่าคุณได้นำไฟล์ต้นฉบับของไลบรารีมาตรฐานเข้ามา
หากคุณต้องการโดยปกติ คุณไม่จำเป็นต้องทำอย่างนั้น
ข้อผิดพลาดทั่วไปอีกประการหนึ่งคือเมื่อประเภทที่ขัดแย้งกันสำหรับ
นี่คือเวลาที่คุณได้กำหนดหรือประกาศฟังก์ชันต้นแบบแล้วเมื่อคุณนำไปใช้จริง
มันไม่เหมือนกับที่คุณประกาศไว้
ตัวอย่างเช่น ต้นแบบมีประเภทผลลัพธ์และชื่อของวงเล็บสำหรับพารามิเตอร์ แล้วตามด้วยเครื่องหมายอัฒภาค
จากนั้นเมื่อคุณกำหนดการใช้งาน คุณจะมีส่วนหัวของฟังก์ชันจริงที่ต่างออกไป
คุณมีประเภทการส่งคืนที่แตกต่างกันหรือคุณมีพารามิเตอร์ที่แตกต่างกัน
และนี่กำลังบอกว่า เฮ้ คุณมีการประกาศฟังก์ชันตัวเดียว
และเมื่อคุณนำไปใช้ด้านล่าง มันต่างไปจากเดิมอย่างสิ้นเชิง
ดังนั้นจึงมีความไม่ตรงกัน
และนี่จะแสดงให้คุณเห็นว่าความขัดแย้งปรากฏในคำจำกัดความก่อนหน้านี้ที่ทำให้เกิดความขัดแย้ง
ดังนั้นในการนำไปใช้งานมักจะเป็นที่ที่จะแสดงให้คุณเห็นบรรทัดเพราะโดยปกติคุณประกาศฟังก์ชั่นของคุณที่ด้านบน
ข้อผิดพลาดรันไทม์ ข้อผิดพลาดรันไทม์เป็นปัญหาในโค้ดของคุณที่เกิดขึ้นเมื่อคุณรันโปรแกรม
ไม่ใช่เมื่อคุณคอมไพล์
ดังนั้นสิ่งเหล่านี้มักจะขัดข้องหรือเป็นข้อผิดพลาดที่ไม่ร้ายแรงที่คุณอาร์เรย์อยู่นอกขอบเขตหรืออะไรทำนองนั้น
เมื่อโปรแกรมกำลังทำงาน คุณมีข้อผิดพลาดทางตรรกะบางอย่าง
ดังนั้นการทำงานของโปรแกรม c อาจยุติลงอย่างกะทันหันโดยมีการหยุดทำงานเมื่อตรวจพบข้อผิดพลาดรันไทม์
ซึ่งเป็นสิ่งที่ไม่สามารถจัดการได้ มีหน่วยความจำที่เสียหายอย่างที่ฉันพูดถึง
ข้อผิดพลาดนอกขอบเขตมักทำให้โปรแกรมหยุดทำงาน
โดยปกติ สิ่งที่คุณจะเห็นคือความผิดพลาดในการแบ่งส่วน
และความผิดพลาดในการแบ่งส่วนไม่ได้บอกอะไรคุณจริงๆ
โดยทั่วไปแล้วสิ่งที่คุณต้องการทำเพื่อวินิจฉัยปัญหานี้เพิ่มเติมคือดูที่
call stack ดังที่ฉันได้กล่าวไว้ก่อนที่โปรแกรมจะขัดข้องทีละบรรทัดเพื่อดูว่าบรรทัดใดทำให้เกิดความผิดพลาด
คุณสามารถรับ call stack ได้หากมีไฟล์หลัก ซึ่งฉันได้กล่าวไว้ก่อนหน้านี้
จากนั้นจาก call stack คุณจะเห็นว่าสายอะไรขัดข้อง
หรือดีกว่านั้น รันดีบักเกอร์ ทีละบรรทัด จากนั้นเมื่อคุณรันบรรทัด ดีบักเกอร์
คุณจะเห็นโปรแกรมหยุดทำงาน และคุณสามารถระบุได้ด้วยวิธีนี้
ดังนั้น นี่เป็นเพียงคำแนะนำเพิ่มเติมเกี่ยวกับข้อผิดพลาดของคอมไพเลอร์
คำเตือน และข้อความ และวิธีตีความข้อผิดพลาดเหล่านี้อีกครั้ง
มีลิงค์ออนไลน์อยู่จริง
หรือถ้าคุณทำ
google มันจะบอกคุณทุกข้อผิดพลาดและคำเตือนของคอมไพเลอร์เดียวที่สามารถผลิตได้และจะให้คำจำกัดความจริง
ๆ ว่าทำไมสิ่งนี้ถึงถูกสร้างขึ้นและอะไรคือปัญหาหลัก
เพราะอีกครั้งข้อผิดพลาดในการคอมไพล์เหล่านั้นอาจเป็นความลับได้มาก
และแม้แต่คำเดียวก็กล่าวว่าการควบคุมที่ไม่สามารถเข้าถึงได้
คุณรู้จากคำอธิบายนั้นโดยไม่จำเป็น
เว้นแต่ว่าคุณมีประสบการณ์นั้น นั่นหมายความว่าคุณไม่มีทางส่งคืนบางสิ่งจากฟังก์ชัน
แต่ถ้าคุณทำ วิธีหนึ่งที่ดีที่สุดในการค้นหาและแก้ไขปัญหาในโปรแกรมของคุณ
เมื่อคุณมีข้อผิดพลาดของคอมไพเลอร์และคุณไม่เข้าใจคอมไพเลอร์นั้น
ให้ google เลย และโดยทั่วไปสิ่งที่จะเกิดขึ้นคือคุณจะไปที่สแต็กโอเวอร์โฟลว์
และมันจะบอกคุณว่านี่คือข้อผิดพลาดของคุณ นี่คือวิธีที่คุณแก้ไข
ฉันทำอย่างนั้นจนถึงทุกวันนี้
ฉันเขียนโปรแกรมในภาษา c มา 15 ปีแล้ว แต่ก็ยังมีบางครั้งที่ฉันเจอสิ่งต่าง
ๆ และฉันก็เหมือนกับว่ามันหมายความว่าอย่างไร
และฉันจะ google มัน ฉันจะเอาคอมไพเลอร์ ใส่ในเครื่องหมายคำพูด
และมันจะบอกฉันว่าเกิดอะไรขึ้น
Stack overflow เป็นเว็บไซต์ที่ดีจริงๆ
และสามารถประหยัดเวลาได้มากในกระบวนการดีบัก
อย่าเพิ่งลองเดาเมื่อคุณเห็นคอมไพเลอร์หรือคำเตือน
คอมไพเลอร์นั้นพยายามจะบอกคุณบางอย่าง และจะระบุให้แน่ชัดว่าเกิดอะไรขึ้น
ดังนั้นหากคุณเข้าใจ คุณจะสามารถแก้ไขปัญหาของคุณได้เร็วกว่ามาก
และหากไม่ใช่สิ่งที่คุณคุ้นเคย
ให้ไปที่ stack overflow หรือไปที่เว็บไซต์ที่อธิบายทั้งหมด และคุณสามารถถอดรหัสได้ด้วยวิธีนี้
ฉันหวังว่านี่จะเป็นประโยชน์ ขอขอบคุณ.