ไลบรารี C ++ 11 ที่รวบรวม (lib, dll และอื่น ๆ ) สามารถเชื่อมโยงกับคอมไพเลอร์ C ++ รุ่นเก่าได้หรือไม่?


12

สามารถคอมไพเลอร์ C ++ รุ่นเก่า (เช่น VS2008 และ gcc3.4) เชื่อมโยงกับไลบรารีภายนอกที่เขียนด้วย C ++ 11 ได้หรือไม่?

ความคิดของฉันคือไฟล์ C ++ 11 .lib เป็นเพียงโค้ดไบต์ในขั้นตอนนี้และไม่ควรรบกวนคอมไพเลอร์รุ่นเก่าที่สร้างขึ้นมาตราบใดที่มันสามารถแก้ไขและเรียกใช้ได้

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

คำตอบ:


10

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

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

คุณไม่ได้เปิดเผยลูกค้าของห้องสมุดของคุณต่อการพึ่งพาของการใช้งานของคุณ

หากคุณสามารถเชื่อมโยงการพึ่งพา (C ++ 11 หรืออะไรก็ได้) กับห้องสมุดของคุณแบบคงที่สิ่งนี้จะสะอาดและอยู่ในตัวเอง ห้องสมุดเป็นกล่องดำจริง: ไม่มีอะไรนอกจากไบต์ แต่แม้ว่าไลบรารีของคุณจะเชื่อมโยงไปยังการพึ่งพาของคุณผ่านการเชื่อมโยง "แบบไดนามิกโดยนัย" (เพื่อไม่ให้สับสนกับชนิดของ LoadLibrary / GetProcAddress อธิบายและวิธีการที่คล้ายกันใน * nix และ OS X) ลูกค้าที่มีอายุมากกว่าควรจะสามารถเชื่อมโยงไปยังห้องสมุด อินเตอร์เฟซที่สาธารณะแม้ว่าพวกเขาจะไม่สามารถเชื่อมโยงไปยังห้องสมุดห้องสมุดขึ้นอยู่กับ


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

4

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

  • ด้วยการแนะนำ C ++ รุ่นใหม่คุณจะต้องแนะนำการปรับใช้ไลบรารีรันไทม์ C ++ ใหม่กับไลบรารีของคุณใช่ไหม
  • คุณไม่ควรใช้ C + 11 ชนิดใหม่ในส่วนต่อประสานสาธารณะของคุณมิฉะนั้นพวกเขาจะไม่สามารถเรียกมันได้
  • โดยทั่วไปคุณควรหลีกเลี่ยงประเภทที่ซับซ้อนเช่น unique_ptr, vector แม้กระทั่ง ฯลฯ ยกเว้นว่าคุณกระจายไลบรารีของคุณเป็นซอร์สโค้ดเค้าโครงของวัตถุในไลบรารีของคุณอาจแตกต่างจากเลย์เอาต์ในรหัสลูกค้า ติดกับประเภทที่เรียบง่ายที่ไม่มีความเสี่ยงของการเปลี่ยนแปลงรูปแบบวัตถุ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.