การเปิดเผยรหัส C ++ ต่อสาธารณะเป็น C API หมายความว่าอย่างไรและข้อดีของการทำคืออะไร


25

ฉันมักจะได้ยินคนพูดว่าโปรแกรมเมอร์ C ++ ควรเปิดเผย API สาธารณะของห้องสมุด / ผลิตภัณฑ์เป็น C API

นั่นหมายถึงอะไรและข้อดีของมันคืออะไร?

คำตอบ:


44

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

extern "C" void foo(int bar);

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

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


14
คุณต้องระมัดระวังที่จะไม่ส่งออกข้อยกเว้นที่ถูกส่งออกไปเช่นกัน!
James

นั่นเป็นคำตอบที่ยอดเยี่ยม คุณช่วยยกตัวอย่างextern "C"สิ่งที่ฉันไม่ได้รับได้ไหม
Daniel Ribeiro

1
@DanielRibeiro: เพียง google สำหรับ "extern C" คุณจะพบลิงก์เช่นนี้: stackoverflow.com/questions/1041866/…
Doc Brown เมื่อ

1
@DanielRibeiro ตัวอย่างง่ายๆที่เพิ่มเข้ามา
Timo Geusch

1
@DanielRibeiro เป็นไปได้ในทางเทคนิคที่จะยังคงใช้อยู่.hppแต่ส่วนขยายนี้หมายถึง "ไฟล์ส่วนหัว C ++" ดังนั้นควรเป็น.hซึ่งใช้สำหรับทั้ง C และ C ++
leemes

8

นอกเหนือจากคำตอบของ Timo - ไม่มี C ++ ABI ที่เป็นมาตรฐานสำหรับบางแพลตฟอร์ม (ตัวอย่างเช่น Windows - บางอย่างเช่น Linux ของ Mac OS X ที่ใช้กันอย่างแพร่หลาย) ดังนั้นมันจึงไม่ใช่แค่คุณสมบัติที่ขาดหายไปเท่านั้น

ตัวอย่างเช่น IIRC MSVC มี ABI ที่แตกต่างกันในแต่ละรุ่นและอาจเปลี่ยนแปลงได้ขึ้นอยู่กับว่ามันเป็น debug หรือ release build - และมันไม่ได้ถูกเผยแพร่ดังนั้น compilers ของบุคคลที่สามมักจะไม่เข้ากัน (ฉันอ่านข้อมูลบางอย่างที่ icc บางรุ่นทำงานร่วมกับ MSVC ปี 2005 แต่อาจเป็นข้อมูลที่เปิดเผยภายใต้ NDA - ไม่จำเป็นสำหรับผู้สร้าง Python) และใช้ ABI ของตนเอง ดังนั้นในสภาพแวดล้อมการปฏิบัติภาษาจะ จำกัด ไม่เพียง แต่รุ่นคอมไพเลอร์

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


2
@DanielRibeiro: ยินดีต้อนรับสู่นรกแห่ง C ++ ABI ที่ยอดเยี่ยม ( en.wikipedia.org/wiki/Application_binary_interface ) เวอร์ชั่นสั้นคือมันยากมากที่จะทำให้คอมไพล์ C ++ คอมไพล์แยกต่างหาก (คอมไพล์ด้วยคอมไพเลอร์ / แฟล็กต่าง ๆ ) ให้ทำงานร่วมกันแทนการล้มเหลว / การหยุดทำงานแบบเงียบ ๆ
Maciej Piechotka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.