ฉันเชื่อว่าฉันมีรหัส C และ C ++ ผสมกันเมื่อฉันไม่ควรมี; นี่เป็นปัญหาและวิธีแก้ไขหรือไม่


10

พื้นหลัง / สถานการณ์

ฉันเริ่มเขียนแอปพลิเคชัน CLI อย่างหมดจดใน C (โปรแกรม C หรือ C ++ ที่เหมาะสมครั้งแรกของฉันที่ไม่ใช่ "Hello World" หรือรูปแบบอื่น ๆ ของมัน) ประมาณครึ่งทางผ่านฉันทำงานกับ "สตริง" ของอินพุตของผู้ใช้ (อาร์เรย์อาร์เรย์) และฉันค้นพบวัตถุลำแสงสตริง C ++ ฉันเห็นว่าฉันสามารถบันทึกรหัสโดยใช้สิ่งเหล่านี้ได้ดังนั้นฉันจึงใช้มันผ่านแอปพลิเคชัน ซึ่งหมายความว่าฉันมีการเปลี่ยนแปลงนามสกุลไฟล์ที่จะ .cpp และตอนนี้รวบรวม app กับแทนg++ gccดังนั้นตามนี้ฉันจะบอกว่าแอปพลิเคชันตอนนี้เป็นแอปพลิเคชั่นทางเทคนิค C ++ (แม้ว่า 90% + ของรหัสจะถูกเขียนในสิ่งที่ฉันจะเรียก C เนื่องจากมีการข้ามไปมาระหว่างสองภาษาจำนวนมาก ทั้งสอง). เป็นไฟล์. cpp ไฟล์เดียวยาวประมาณ 900 บรรทัด

ปัจจัยสำคัญ

ฉันต้องการให้โปรแกรมฟรี (เป็นเงิน) และสามารถแจกจ่ายได้อย่างอิสระและใช้ได้สำหรับทุกคน ความกังวลของฉันคือใครบางคนจะมองไปที่รหัสและคิดอะไรบางอย่างเพื่อผลของ:

โอ้ดูที่การเข้ารหัสมันแย่มากโปรแกรมนี้ช่วยฉันไม่ได้

เมื่อมันอาจเป็นไปได้! อีกเรื่องหนึ่งคือรหัสที่มีประสิทธิภาพ (เป็นโปรแกรมสำหรับทดสอบการเชื่อมต่ออีเธอร์เน็ต) ไม่ควรมีส่วนใดของรหัสที่ไม่มีประสิทธิภาพจนสามารถขัดขวางประสิทธิภาพของแอปพลิเคชั่นหรือเอาท์พุทได้อย่างรุนแรง อย่างไรก็ตามฉันคิดว่าเป็นคำถามสำหรับ Stack Overflow เมื่อขอความช่วยเหลือเกี่ยวกับฟังก์ชั่นวิธีการโทรวัตถุ ฯลฯ

คำถามของฉัน

มี (ในความคิดของฉัน) ผสม C และ C ++ ที่บางทีฉันไม่ควร ฉันควรจะเขียนมันใหม่ทั้งหมดใน C ++ (โดยสิ่งนี้ฉันหมายถึงการใช้วัตถุและวิธีการ C ++ เพิ่มเติมซึ่งบางทีฉันได้เขียนอะไรบางอย่างในรูปแบบ C ที่สามารถควบแน่นโดยใช้เทคนิค C ++ ที่ใหม่กว่า) หรือลบการใช้ นำทุกอย่าง "ย้อนกลับ" เป็นรหัส C หรือไม่ มีวิธีที่ถูกต้องที่นี่? ฉันหลงทางและต้องการแนวทางในการรักษาแอปพลิเคชันนี้ "ดี" ในสายตาของมวลชนดังนั้นพวกเขาจะใช้มันและได้รับประโยชน์จากมัน

รหัส - อัปเดต

นี่คือลิงค์ไปยังรหัส มันเป็นความเห็นประมาณ 40% ฉันแสดงความคิดเห็นเกือบทุกบรรทัดจนกว่าฉันจะรู้สึกคล่องแคล่วมากขึ้น ในสำเนาที่ฉันเชื่อมโยงไว้ฉันได้ลบความคิดเห็นทั้งหมดค่อนข้างมาก ฉันหวังว่านี่จะไม่ทำให้อ่านยากเกินไป ฉันหวังว่าจะไม่มีใครจำเป็นต้องเข้าใจอย่างถ่องแท้ ถ้าฉันได้ออกแบบข้อบกพร่องร้ายแรงฉันหวังว่าพวกเขาควรจะพิสูจน์ได้ง่าย ฉันควรพูดถึงฉันกำลังเขียนเดสก์ท็อปและแล็ปท็อป Ubuntu สองตัว ฉันไม่ได้ตั้งใจจะย้ายรหัสไปยังระบบปฏิบัติการอื่น


3
ฉันแก้ปัญหา CLI ให้คุณแล้ว CLI ยังสามารถอ้างถึงโครงสร้างพื้นฐานภาษาทั่วไปซึ่งไม่ได้มีเหตุผลอะไรมากนักจากมุมมอง C
Robert Harvey

คุณสามารถเขียนใหม่ใน FORTRAN ฉันไม่เคยได้ยิน OOF
ott--

2
ฉันจะไม่กังวลมากเกินไปเกี่ยวกับคนที่ไม่ได้ใช้ซอฟต์แวร์ของคุณหากไม่ใช่ "สวย" 99% ของผู้ใช้ของคุณจะไม่แม้แต่ดูรหัสหรือสนใจว่ามันเขียนตราบเท่าที่มันสำเร็จสิ่งที่พวกเขาต้องการให้ทำ อย่างไรก็ตามเป็นสิ่งสำคัญที่รหัสควรสอดคล้องกันและอื่น ๆ เพื่อช่วยคุณในการรักษารหัสระยะยาว
Evicatos

1
ทำไมคุณไม่ทำสิ่งที่คุณซอฟต์แวร์ฟรี (เช่นภายใต้GPLv3ใบอนุญาต) กับรหัสบนเช่นGitHub รหัสของคุณไม่มีLICENSEไฟล์ คุณอาจได้รับข้อเสนอแนะที่น่าสนใจ
Basile Starynkevitch

คำตอบ:


13

เริ่มกันที่จุดเริ่มต้นกัน: รหัสผสม C และ C ++ นั้นค่อนข้างธรรมดา ดังนั้นคุณอยู่ในสโมสรใหญ่ที่จะเริ่มต้นด้วย เรามีรหัสฐาน C ขนาดใหญ่ในป่า แต่ด้วยเหตุผลที่ชัดเจนโปรแกรมเมอร์หลายคนปฏิเสธที่จะเขียนอย่างน้อยสิ่งใหม่ใน C มีการเข้าถึง C ++ ในคอมไพเลอร์เดียวกันโมดูลใหม่เริ่มเขียนในลักษณะนั้น - ตอนแรกเพิ่งออกจากส่วนที่มีอยู่คนเดียว

ในที่สุดไฟล์ที่มีอยู่บางไฟล์ก็จะถูกคอมไพล์ใหม่เป็น C ++ และบางบริดจ์สามารถลบได้ ... แต่มันอาจใช้เวลานานมาก

คุณอยู่ข้างหน้าค่อนข้างเต็มระบบของคุณตอนนี้ C ++ เพียงแค่ส่วนใหญ่จะเขียนว่า "C-style" และคุณเห็นการผสมผสานของสไตล์ปัญหาสิ่งที่คุณไม่ควร: C ++ เป็นภาษาแบบหลายกระบวนทัศน์ที่สนับสนุนหลายสไตล์และทำให้พวกมันมีอยู่ร่วมกันได้ดี จริงๆแล้วนั่นคือจุดแข็งหลักที่คุณไม่ได้ถูกบังคับให้เป็นสไตล์เดียว หนึ่งที่จะไม่น่าสนใจที่นี่และที่นั่นด้วยโชคไม่ได้ทุกที่

re-working codebase เป็นความคิดที่ดีถ้ามันเสีย หรือถ้าเป็นในทางของการพัฒนา แต่ถ้ามันใช้งานได้ (ในความหมายของคำเดิม) โปรดปฏิบัติตามหลักการทางวิศวกรรมขั้นพื้นฐานที่สุด: ถ้ามันยังไม่พังไม่ต้องแก้ไข ออกจากส่วนที่เย็นเพียงอย่างเดียว ในส่วนที่ไม่ดีเป็นอันตราย - หรือในคุณสมบัติใหม่และเพียงแค่ส่วน refactor เพื่อให้พวกเขานอน

หากคุณค้นหาสิ่งทั่วไปเพื่อที่อยู่นี่คือสิ่งที่คุ้มค่า evicting จาก codebase C:

  • ฟังก์ชัน str * ทั้งหมดและ char [] - แทนที่ด้วยสตริงคลาส
  • หากคุณใช้ sprintf ให้สร้างเวอร์ชันที่ส่งคืนสตริงด้วยผลลัพธ์หรือวางไว้ในสตริงและแทนที่การใช้งาน (หากคุณไม่เคยใส่ใจกับกระแสข้อมูลที่ทำเองและเพียงข้ามพวกเขาเว้นแต่คุณจะชอบพวกเขา gcc ให้ความปลอดภัยประเภทที่สมบูรณ์แบบออกจากกล่องสำหรับการตรวจสอบรูปแบบเพียงเพิ่มคุณสมบัติที่เหมาะสม
  • malloc ส่วนใหญ่และฟรี - ไม่ต้องมีใหม่และลบ แต่เวกเตอร์รายการแผนที่และของสะสมอื่น ๆ
  • การจัดการหน่วยความจำส่วนที่เหลือ (หลังจากสองจุดก่อนหน้านี้จะต้องค่อนข้างหายากครอบคลุมด้วยตัวชี้สมาร์ทหรือใช้คอลเลกชันพิเศษของคุณ
  • แทนที่การใช้ทรัพยากรอื่น ๆ ทั้งหมด (ไฟล์ *, mutex, ล็อค ฯลฯ ) เพื่อใช้ RAII wrappers หรือคลาส

เมื่อคุณทำเสร็จแล้วเมื่อคุณเข้าใกล้จุดที่ codebase นั้นปลอดภัยพอสมควรดังนั้นคุณสามารถวางฟุตบอลรหัสกลับโดยใช้ข้อยกเว้นและลอง / จับได้ยากในฟังก์ชั่นระดับสูงเท่านั้น

นอกเหนือจากนั้นเพียงแค่เขียนรหัสใหม่ใน C ++ ที่มีสุขภาพดีและถ้าบางคลาสเกิดมาเพื่อแทนที่รหัสเดิมที่มีอยู่ให้หยิบมันขึ้นมา

ฉันไม่ได้กล่าวถึงสิ่งที่เกี่ยวข้องกับไวยากรณ์เห็นได้ชัดว่าใช้ refs แทนตัวชี้ในรหัสใหม่ทั้งหมด แต่การแทนที่ส่วน C เก่าสำหรับการเปลี่ยนแปลงนั้นไม่คุ้มค่า ปลดเปลื้องคุณต้องจัดการขจัดสิ่งที่คุณทำได้และใช้ตัวแปร C ++ ในฟังก์ชั่น wrapper สำหรับส่วนที่เหลือ และที่สำคัญให้เพิ่ม const ทุกที่ที่เกี่ยวข้อง สิ่งเหล่านี้เกี่ยวข้องกับกระสุนก่อนหน้า และรวมมาโครของคุณและแทนที่สิ่งที่คุณสามารถทำได้ใน enum, ฟังก์ชั่นอินไลน์หรือเทมเพลต

ฉันขอแนะนำให้อ่านมาตรฐานการเข้ารหัส C ++ ของ Sutter / Alexandrescu หากยังไม่ได้ทำและปฏิบัติตามอย่างใกล้ชิด


ขอบคุณมากสำหรับการป้อนข้อมูล Balog คำแนะนำเสียงทั้งหมดในสายตาของฉันและฉันเห็นด้วยกับมันทั้งหมด ฉันจะค่อยๆเปลี่ยนส่วนของรหัสตามส่วนที่ฉันคิดว่าจัดลำดับความสำคัญรหัสการทำงาน
jwbensley

7

ในระยะสั้น: คุณจะไม่ตกนรกไม่มีอะไรเลวร้ายเกิดขึ้น แต่คุณจะไม่ชนะการแข่งขันความงามเช่นกัน

แม้ว่าจะเป็นไปได้อย่างสมบูรณ์ที่จะใช้ C ++ ในฐานะ "Better C" คุณจึงละทิ้งประโยชน์หลายประการของ C ++ แต่เนื่องจากคุณไม่ได้ จำกัด ตัวเองกับ Vanilla C คุณจึงไม่ได้รับผลประโยชน์ใด ๆ จาก C (ความเรียบง่าย ความโปร่งใสการทำงานร่วมกัน) กล่าวอีกนัยหนึ่ง: C ++ เสียสละคุณสมบัติบางอย่างของ C เพื่อให้ได้มาซึ่งคนอื่น - ตัวอย่างเช่นความโปร่งใสของ C ที่คุณสามารถเห็นได้อย่างชัดเจนว่าที่ไหนและเมื่อใดการจัดสรรหน่วยความจำเกิดขึ้นเพื่อแลกกับนามธรรมที่ทรงพลังกว่าของ C ++

เนื่องจากรหัสของคุณดูเหมือนจะทำงานได้ดีในตอนนี้อาจไม่ใช่ความคิดที่ดีที่จะเขียนใหม่เพื่อประโยชน์ของมัน: รักษามันตามที่เป็นอยู่ในตอนนี้และเปลี่ยนเป็นสำนวน C ++ ที่มากขึ้นในแต่ละครั้ง เมื่อใดก็ตามที่คุณทำงานในส่วนใดก็ตาม และเก็บบทเรียนไว้ในใจสำหรับโครงการต่อไปของคุณส่วนใหญ่ทั้งหมดนี้: C และ C ++ ไม่ใช่ภาษาเดียวกันและคุณดีกว่าที่จะตัดสินใจเลือกล่วงหน้ากว่าการเปลี่ยนมาใช้ C ++ ครึ่งทางผ่านโครงงาน .


ขอบคุณ tdammers สำหรับคำแนะนำ ฉันเห็นด้วยกับสิ่งที่คุณพูดและฉันจะเอามันไปบนเรือขอบคุณ!
jwbensley

4

C ++ เป็นภาษาที่ซับซ้อนมากในแง่ที่ว่ามันมีคุณสมบัติมากมาย นอกจากนี้ยังเป็นภาษาที่รองรับกระบวนทัศน์หลายแบบซึ่งหมายความว่าจะช่วยให้คุณสามารถเขียนโค้ดขั้นตอนทั้งหมดโดยไม่ต้องใช้วัตถุใด ๆ

ดังนั้นเนื่องจาก C ++ นั้นซับซ้อนคุณมักจะเห็นคนใช้ชุดย่อยบางส่วนของคุณสมบัติในรหัสของพวกเขา ผู้เริ่มต้นมักจะใช้สตรีม I / O, วัตถุสตริงและใหม่ / ลบแทน malloc / ฟรีและอาจจะอ้างอิงแทนตัวชี้ เมื่อคุณเรียนรู้เกี่ยวกับคุณสมบัติเชิงวัตถุคุณอาจเริ่มเขียนในสไตล์ที่เรียกว่า "C with classes" ในที่สุดเมื่อคุณเรียนรู้เพิ่มเติมเกี่ยวกับ C ++ คุณจะเริ่มใช้เทมเพลตRAII , STL , ตัวชี้อัจฉริยะ ฯลฯ

ประเด็นที่ฉันพยายามทำคือการเรียนรู้ C ++ เป็นกระบวนการที่ต้องใช้เวลา ใช่ตอนนี้โค้ดของคุณอาจดูเหมือนว่ามันถูกเขียนโดยโปรแกรมเมอร์ C ที่พยายามเขียน C ++ และเนื่องจากคุณเป็นเพียงการเรียนรู้ อย่างไรก็ตามมันทำให้ฉันหงุดหงิดเมื่อฉันเห็นสิ่งนี้ในรหัสการผลิตที่เขียนโดยโปรแกรมเมอร์ที่มีประสบการณ์ซึ่งควรจะรู้ดีกว่า

เพียงจำไว้ว่าโปรแกรมเมอร์ Fortran ที่ดีสามารถเขียนโค้ด Fortran ได้ดีในทุกภาษา :)


2

ดูเหมือนว่าคุณกำลังสรุปเส้นทางที่โปรแกรมเมอร์ C อายุมากใช้เมื่อไปที่ C ++ คุณกำลังใช้มันเป็น "ดีกว่า C" ยี่สิบปีที่ผ่านมาสิ่งนี้ทำให้รู้สึกบางอย่าง แต่ ณ จุดนี้มีโครงสร้างที่มีประสิทธิภาพมากขึ้นใน C ++ (เช่นไลบรารีแม่แบบมาตรฐาน) ที่ไม่ค่อยมีเหตุผลในขณะนี้ อย่างน้อยที่สุดคุณควรทำสิ่งต่อไปนี้เพื่อหลีกเลี่ยงการให้โป่งพองของโปรแกรมเมอร์ C ++ เมื่อดูรหัสของคุณ:

  • ใช้สตรีมแทนการ? printfครอบครัว.
  • ใช้แทนnewmalloc
  • ใช้คลาสคอนเทนเนอร์ STL สำหรับโครงสร้างข้อมูลทั้งหมด
  • ใช้std::stringแทนchar*ได้ทุกที่
  • ทำความเข้าใจและใช้RAII

หากโปรแกรมของคุณสั้น (และ ~ 900 บรรทัดดูเหมือนสั้น) โดยส่วนตัวฉันไม่คิดว่าจะต้องสร้างชุดคลาสที่มีประสิทธิภาพหรือแม้แต่มีประโยชน์


ขอบคุณสำหรับคำแนะนำของสตีเว่นใช่ฉันมีความคิดแบบเดียวกันกับคลาสและฉันคิดว่าฉันสามารถจัดระเบียบโค้ดให้เป็นไฟล์เดียวที่เรียบร้อย ขอบคุณ!
jwbensley

2

คำตอบที่ได้รับการยอมรับกล่าวถึงข้อดีของการแปลง C เป็น idiomatic C ++ ราวกับว่ารหัส C ++ จะมีความหมายที่ดีกว่ารหัส C ฉันเห็นด้วยกับคำตอบอื่น ๆ ที่อาจไม่จำเป็นต้องทำการเปลี่ยนแปลงที่รุนแรงใด ๆ กับรหัสผสมถ้ามันไม่แตก

การผสม C และ C ++ นั้นยั่งยืนหรือไม่นั้นขึ้นอยู่กับวิธีการผสม ข้อบกพร่องที่ละเอียดสามารถนำมาใช้เช่นเมื่อยกข้อยกเว้นในรหัส C (ซึ่งไม่ปลอดภัยยกเว้น) ทำให้เกิดการรั่วไหลของหน่วยความจำหรือข้อมูลเสียหาย วิธีที่ปลอดภัยและค่อนข้างทั่วไปคือการห่อ C-libraries หรืออินเตอร์เฟสในคลาสหรือใช้มันในการแยกประเภทอื่นในโครงการ C ++

ก่อนที่คุณจะตัดสินใจเขียนโครงการทั้งหมดของคุณใหม่ให้เป็นสำนวน C ++ (หรือ C) คุณควรทราบว่าการเปลี่ยนแปลงจำนวนมากที่แสดงในคำตอบอื่น ๆ อาจทำให้โปรแกรมของคุณช้าลงหรือทำให้เกิดผลกระทบที่ไม่พึงประสงค์อื่น ๆ ตัวอย่างเช่น:

  • การเปลี่ยน C-strings สแต็กที่จัดสรรให้เป็นสตริง std :: สามารถทำให้การจัดสรรฮีปที่ไม่จำเป็น
  • การเปลี่ยนพอยน์เตอร์แบบ raw เป็นบางประเภทของตัวชี้ที่ใช้ร่วมกัน (เช่น std :: shared_ptr) ทำให้เกิดค่าใช้จ่ายในการเข้าถึงเนื่องจากการนับการอ้างอิงฟังก์ชันสมาชิกเสมือนภายในและความปลอดภัยของเธรด
  • กระแสไลบรารีมาตรฐานจะช้ากว่า C คู่กัน
  • การใช้คลาสของ RAII อย่างไม่ระมัดระวังเช่นคอนเทนเนอร์สามารถทำให้เกิดการดำเนินการที่ไม่จำเป็นโดยเฉพาะเมื่อไม่สามารถใช้ซีแมนติกส์ของ C ++ 11 ได้
  • แม่แบบอาจทำให้เกิดการรวบรวมอีกต่อไปข้อผิดพลาดในการรวบรวมที่ไม่ชัดเจนปัญหาการขยายตัวของโค้ดและปัญหาการพกพาระหว่างคอมไพเลอร์
  • การเขียนรหัสที่ปลอดภัยยกเว้นเป็นเรื่องยากซึ่งทำให้การแนะนำข้อบกพร่องที่ลึกซึ้งในระหว่างการแปลงเป็นเรื่องง่าย
  • มันเป็นเรื่องยากที่จะใช้รหัส C ++ จากไลบรารีที่ใช้ร่วมกันกว่าธรรมดา C
  • C ++ ไม่รองรับอย่างกว้างขวางเช่น C89

เพื่อสรุปการแปลงจากรหัส C และ C ++ ที่ผสมกันไปเป็นสำนวน C ++ ควรถูกมองว่าเป็นการแลกเปลี่ยนที่มีมากไปกว่าเวลาดำเนินการและขยายกล่องเครื่องมือของคุณด้วยคุณสมบัติที่สะดวกสบาย ดังนั้นจึงเป็นเรื่องยากมากที่จะให้คำตอบสำหรับกรณีทั่วไปนอกเหนือจาก "มันขึ้นอยู่กับ"


"ลำธารไลบรารีมาตรฐานช้ากว่า C คู่กัน": น่าจะเป็นเรื่องยากสำหรับการทำให้เป็นสากลมากกว่า printf อยู่ดี
Deduplicator

1

มันเป็นรูปแบบที่ไม่ดีในการผสม C และ C ++ เป็นภาษาที่แตกต่างกันและควรได้รับการปฏิบัติเช่นนี้ เลือกสิ่งที่คุณพอใจที่สุดและลองเขียนรหัสในภาษานั้น

ถ้า C ++ คุณกำลังบันทึกรหัสจำนวนมากอยู่ติดกับ C ++ และเขียนส่วน C อีกครั้ง ฉันสงสัยว่าความแตกต่างของประสิทธิภาพจะเห็นได้ชัดเจนหากเป็นสิ่งที่คุณกังวล


ดังนั้นฉันจึงมีห้องสมุดแห่งนี้ที่ฉันต้องการใช้ซึ่งเขียนด้วยภาษา C และฉันมีห้องสมุดอื่นที่ฉันต้องการใช้ซึ่งเขียนด้วยภาษา C ++ ... รหัสการเขียนซ้ำที่ทำงานได้ดีเพียงแค่สร้างงานที่ไม่จำเป็น
gnasher729

1

ฉันกลับไปกลับมาระหว่าง C และ C ++ ตลอดเวลาและเป็นประเภทคี่บอลที่ชอบทำงานแบบนี้ ฉันชอบ C ++ สำหรับสิ่งที่สูงกว่าในขณะที่ฉันใช้ C เป็นเครื่องมือทื่อที่อนุญาตให้ฉันพิมพ์ข้อมูลเอ็กซ์เรย์และรักษาพวกเขาเช่นบิตและไบต์ด้วยพูดmemcpyซึ่งฉันพบว่ามีประโยชน์สำหรับการใช้โครงสร้างข้อมูลระดับต่ำและตัวจัดสรรหน่วยความจำ . หากคุณพบว่าตัวเองทำงานในระดับบิตบิตและไบต์ระบบที่สมบูรณ์แบบของ C ++ จะไม่ช่วยอะไรเลยและฉันมักจะเขียนโค้ดใน C ที่ฉันสามารถสันนิษฐานได้ว่าปลอดภัย ปฏิบัติกับชนิดข้อมูล C ใด ๆ เพียงบิตและไบต์

สิ่งสำคัญที่ต้องจำไว้คือที่ทั้งสองภาษาไม่สอดคล้องกัน

1.ฟังก์ชั่น AC ไม่ควรเรียกฟังก์ชั่น C ++ throwซึ่งสามารถ เมื่อพิจารณาถึงจำนวนตำแหน่งของรหัส C ++ ทุกวันที่คุณสามารถใช้กับข้อยกเว้นได้นั่นหมายความว่าฟังก์ชัน C ของคุณไม่ควรเรียกใช้ฟังก์ชัน C ++ โดยทั่วไป มิฉะนั้นรหัส C ของคุณจะไม่สามารถเพิ่มทรัพยากรที่จัดสรรในระหว่างการคลายสแต็กได้เนื่องจากไม่มีวิธีที่เป็นประโยชน์ในการตรวจจับข้อยกเว้น C ++ หากคุณต้องการให้รหัส C ของคุณเรียกใช้ฟังก์ชัน C ++ เป็นการติดต่อกลับเช่นด้าน C ++ ควรตรวจสอบให้แน่ใจว่ามีการตรวจพบข้อยกเว้นใด ๆ ที่เกิดขึ้นก่อนกลับไปที่รหัส C

2.ถ้าคุณเขียนรหัส C ที่ใช้กับชนิดข้อมูลเป็นบิตและไบต์แบบดิบ ๆ การดึงข้อมูลไปยังระบบประเภท (นี่คือเหตุผลหลักที่ฉันใช้ C ในครั้งแรก) คุณไม่ต้องการใช้รหัสดังกล่าวกับข้อมูล C ++ ประเภทซึ่งอาจมีการคัดลอกตัวสร้างและ destructors และพอยน์เตอร์เสมือนและสิ่งที่เรียงลำดับที่ต้องเคารพ ดังนั้นโดยทั่วไปควรเป็นรหัส C ที่ใช้รหัส C ของการจัดเรียงนี้ไม่ใช่รหัส C ++ ที่ใช้รหัส C ในการจัดเรียงนี้

หากคุณต้องการให้รหัส C ++ ของคุณใช้รหัส C เช่นนั้นโดยทั่วไปคุณต้องการใช้เป็นรายละเอียดการใช้งานของคลาสซึ่งทำให้แน่ใจได้ว่าข้อมูลที่เก็บอยู่ในโครงสร้างข้อมูล C ทั่วไปเป็นประเภทข้อมูลที่ไม่สำคัญในการสร้าง และทำลาย โชคดีที่มีลักษณะประเภทเช่นนี้ซึ่งคุณสามารถใช้เพื่อตรวจสอบว่าในการยืนยันแบบคงที่ให้แน่ใจว่าประเภทที่คุณเก็บไว้ในโครงสร้างข้อมูล C ทั่วไปมี destructors เล็กน้อยและก่อสร้างและจะอยู่อย่างนั้น

ฉันควรจะเขียนมันใหม่ทั้งหมดใน C ++ (โดยสิ่งนี้ฉันหมายถึงการใช้วัตถุและวิธีการ C ++ เพิ่มเติมซึ่งบางทีฉันได้เขียนอะไรบางอย่างในรูปแบบ C ที่สามารถควบแน่นโดยใช้เทคนิค C ++ ที่ใหม่กว่า) หรือลบการใช้ นำทุกอย่าง "ย้อนกลับ" เป็นรหัส C หรือไม่

ในความคิดของฉันคุณไม่จำเป็นต้องกังวลหากคุณปฏิบัติตามกฎข้างต้นและตรวจสอบให้แน่ใจว่าโค้ดของคุณผ่านการทดสอบอย่างดีกับการทดสอบที่คุณเขียน ส่วนที่ควรปรับปรุงคือโค้ดที่คุณเขียนใน C ++ จนถึงตอนนี้ แต่นั่นไม่ได้หมายความว่าคุณต้องย้ายรหัสที่ใช้ C-based C ++ อย่างเคร่งครัด

ด้วยรหัสที่คุณเขียนใน C ++ และคอมไพล์เป็นรหัส C ++ คุณต้องระวัง การใช้การเข้ารหัสเหมือน C ใน C ++ กำลังถามถึงปัญหา ตัวอย่างเช่นหากคุณจัดสรรและเพิ่มทรัพยากรด้วยตนเองโอกาสที่รหัสของคุณจะไม่ได้รับการยกเว้นเนื่องจากรหัสของคุณอาจพบข้อยกเว้น ณ จุดที่คุณออกจากฟังก์ชันโดยปริยายก่อนที่คุณจะสามารถfreeใช้ทรัพยากรได้ ใน C ++, RAII และสิ่งต่าง ๆ เช่นสมาร์ทพอยน์เตอร์นั้นไม่สะดวกสบายเพราะมันอาจปรากฏขึ้นหากคุณดูที่เส้นทางการทำงานปกติโดยไม่พิจารณาเส้นทางที่พิเศษ พวกเขามักจะเป็นความจำเป็นขั้นพื้นฐานในการเขียนรหัสข้อยกเว้นที่ถูกต้องอย่างง่ายดายและมีประสิทธิภาพซึ่งจะไม่เพียงแค่เริ่มรั่วทั่วสถานที่เมื่อพบข้อยกเว้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.