ฉันกำลังทำงานในโครงการที่มีรหัสCดั้งเดิมมากมาย เราได้เริ่มเขียนใน C ++ โดยมีเจตนาที่จะแปลงรหัสดั้งเดิมในที่สุดเช่นกัน ฉันสับสนเล็กน้อยเกี่ยวกับการโต้ตอบของCและ C ++ ฉันเข้าใจว่าการห่อรหัสCด้วยextern "C"
คอมไพเลอร์ C ++ จะไม่ทำให้ชื่อของรหัสCเสื่อมลงแต่ฉันไม่แน่ใจว่าจะใช้สิ่งนี้ได้อย่างไร
ดังนั้นที่ด้านบนของไฟล์ส่วนหัวCแต่ละไฟล์ (หลังจากที่มียามรวม) เรามี
#ifdef __cplusplus
extern "C" {
#endif
และที่ด้านล่างเราเขียน
#ifdef __cplusplus
}
#endif
ในระหว่างสองเรามีทั้งหมดของเรารวมถึง typedefs และฟังก์ชั่นต้นแบบ ฉันมีคำถามสองสามข้อเพื่อดูว่าฉันเข้าใจสิ่งนี้ถูกต้องหรือไม่:
ถ้าฉันมีไฟล์ C ++ A.hh ซึ่งรวมถึงไฟล์ส่วนหัวC Bh รวมถึงไฟล์ส่วนหัวCอีกCh วิธีนี้ทำงานอย่างไร ฉันคิดว่าเมื่อคอมไพเลอร์เข้าสู่ Bh
__cplusplus
จะถูกกำหนดดังนั้นมันจะล้อมโค้ดด้วยextern "C"
(และ__cplusplus
จะไม่ถูกกำหนดภายในบล็อกนี้) ดังนั้นเมื่อเข้าสู่ Ch แล้ว__cplusplus
จะไม่ถูกกำหนดและรหัสจะไม่ถูกรวมเข้าด้วยextern "C"
กัน ถูกต้องหรือไม่มีอะไรผิดปกติในการห่อโค้ดด้วย
extern "C" { extern "C" { .. } }
หรือไม่? สิ่งที่สองextern "C"
จะทำอย่างไรเราไม่ได้ใส่เสื้อคลุมนี้ไว้รอบ ๆ ไฟล์. c เพียงแค่ไฟล์. h แล้วจะเกิดอะไรขึ้นถ้าฟังก์ชั่นไม่มีต้นแบบ? คอมไพเลอร์คิดว่าเป็นฟังก์ชั่น C ++ หรือไม่?
นอกจากนี้เรายังใช้รหัสของบุคคลที่สามซึ่งเขียนด้วยภาษา Cและไม่มีเสื้อคลุมแบบนี้อยู่รอบ ๆ เมื่อใดก็ตามที่ฉันรวมส่วนหัวจากห้องสมุดนั้นฉันได้ใส่
extern "C"
#include นี่เป็นวิธีที่ถูกต้องในการจัดการกับเรื่องนี้หรือไม่?ในที่สุดการตั้งค่านี้เป็นความคิดที่ดีหรือไม่? มีอะไรอีกบ้างที่เราควรทำ? เรากำลังจะผสมCและ C ++ สำหรับอนาคตอันใกล้และฉันต้องการให้แน่ใจว่าเราครอบคลุมฐานทั้งหมดของเรา
To ensure that the names declared in that portion of code have C linkage, and thus C++ name mangling is not performed.
(ผมเคยได้รับมันจากการเชื่อมโยง )