ฉันมักจะได้ยินคนพูดว่าโปรแกรมเมอร์ C ++ ควรเปิดเผย API สาธารณะของห้องสมุด / ผลิตภัณฑ์เป็น C API
นั่นหมายถึงอะไรและข้อดีของมันคืออะไร?
ฉันมักจะได้ยินคนพูดว่าโปรแกรมเมอร์ C ++ ควรเปิดเผย API สาธารณะของห้องสมุด / ผลิตภัณฑ์เป็น C API
นั่นหมายถึงอะไรและข้อดีของมันคืออะไร?
คำตอบ:
หมายความว่าส่วนของไลบรารีของคุณที่ถูกเปิดเผยเป็นอินเทอร์เฟซใช้ C "ส่วน" ของภาษาเท่านั้นดังนั้นคุณจะไม่ส่งออกคลาสหรือฟังก์ชันที่คล้ายกันเฉพาะ POD และ struct ที่มี POD นอกจากนี้คุณต้องปิดการใช้ชื่อ C ++ mangling extern "C"
มักจะประสบความสำเร็จโดยการทำเครื่องหมายหน้าที่เป็น ตัวอย่างทั่วไปจะเป็น:
extern "C" void foo(int bar);
ข้อได้เปรียบที่สำคัญของการเปิดเผยไลบรารีของคุณในลักษณะนี้ก็คือภาษาการเขียนโปรแกรมทุกภาษานั้นมีกลไกในการเชื่อมต่อโดยตรงกับไลบรารี C แต่มีเพียงไม่กี่คนเท่านั้นที่สามารถเชื่อมต่อโดยตรงกับไลบรารี C ++ ได้ ดังนั้นในแง่นั้นคุณจะต้องเป็นตัวหารร่วมที่ต่ำที่สุดเพื่อให้คนอื่นสามารถใช้ห้องสมุดของคุณได้ง่ายขึ้น
อย่างไรก็ตามโปรดทราบว่านี่เป็นเพียงกลยุทธ์ที่มีประโยชน์หากคุณกำลังสร้างห้องสมุดเพื่อให้ผู้อื่นได้ใช้ หากคุณกำลังสร้างชิ้นส่วนของ C ++ - เฉพาะซอฟต์แวร์และไลบรารีเท่านั้นที่ต้องเชื่อมต่อซึ่งกันและกันคุณจะ (IMHO) ดีกว่าที่จะเปิดเผย API ของ C ++ ที่เหมาะสมเพื่อให้คุณสามารถใช้ภาษาได้อย่างเต็มประสิทธิภาพ
extern "C"
สิ่งที่ฉันไม่ได้รับได้ไหม
.hpp
แต่ส่วนขยายนี้หมายถึง "ไฟล์ส่วนหัว C ++" ดังนั้นควรเป็น.h
ซึ่งใช้สำหรับทั้ง C และ C ++
นอกเหนือจากคำตอบของ Timo - ไม่มี C ++ ABI ที่เป็นมาตรฐานสำหรับบางแพลตฟอร์ม (ตัวอย่างเช่น Windows - บางอย่างเช่น Linux ของ Mac OS X ที่ใช้กันอย่างแพร่หลาย) ดังนั้นมันจึงไม่ใช่แค่คุณสมบัติที่ขาดหายไปเท่านั้น
ตัวอย่างเช่น IIRC MSVC มี ABI ที่แตกต่างกันในแต่ละรุ่นและอาจเปลี่ยนแปลงได้ขึ้นอยู่กับว่ามันเป็น debug หรือ release build - และมันไม่ได้ถูกเผยแพร่ดังนั้น compilers ของบุคคลที่สามมักจะไม่เข้ากัน (ฉันอ่านข้อมูลบางอย่างที่ icc บางรุ่นทำงานร่วมกับ MSVC ปี 2005 แต่อาจเป็นข้อมูลที่เปิดเผยภายใต้ NDA - ไม่จำเป็นสำหรับผู้สร้าง Python) และใช้ ABI ของตนเอง ดังนั้นในสภาพแวดล้อมการปฏิบัติภาษาจะ จำกัด ไม่เพียง แต่รุ่นคอมไพเลอร์
ในที่สุด C ++ ก็มีคุณสมบัติการคอมไพล์เวลามากขึ้น ตัวอย่างเช่นชื่อสามัญมักไม่มีอยู่ในภาษาที่พิมพ์แบบไดนามิกเป็นต้น