ภาษา C ++ ภาษาอื่น ๆ นอกเหนือจาก C?


25

ภาษา C ++ อนุญาตให้มีการผสมทั้ง C ++ และ C ในไฟล์ต้นฉบับหนึ่งไฟล์ ตัวอย่างเช่น,

extern "C" {
    struct bar { /* ... */ }
}

C ++ หรือเคยรองรับภาษาอื่น ๆ นอกเหนือจากภาษา C หรือไม่? เช่นextern "Pascal"หรือextern "Haskell"


เวลาส่วนใหญ่ทั้งสองภาษาจะทำการextern "C"โต้ตอบกันได้
ratchet freak

C ++ สนับสนุนการเชื่อมโยงอื่น ๆ โดยอนุญาตให้ imlementations เพิ่มประเภทการเชื่อมโยง (§7.5) คำถามควรเป็น "มีการใช้งานหรือมีการใช้งานอยู่" ;-)
johannes

2
extern "C"ส่งผลกระทบต่อการเชื่อมโยงเท่านั้นไม่ใช่ไวยากรณ์และความหมายของข้อความที่อยู่ในบล็อก กล่าวอีกอย่างหนึ่งก็คือมันยังคงมีภาษา C ++ อยู่ในextern "C"บล็อก ชื่อสัญลักษณ์ไม่ได้ยุ่งเหยิง ดูstackoverflow.com/q/1041866/712605
Richard Hansen

คำตอบ:


17

extern "C" อาจเป็นสิ่งที่จำเป็นเท่านั้น:

การติดตั้งทุกครั้งจะต้องมีการเชื่อมโยงไปยังฟังก์ชั่นที่เขียนด้วยภาษาการเขียนโปรแกรม C, "C" และการเชื่อมโยงไปยังฟังก์ชั่น C ++, "C ++"

อย่างไรก็ตามผู้อื่นสามารถมีอยู่ตามคำพูดนี้:

สตริงตัวอักษรบ่งชี้ถึงการเชื่อมโยงภาษาที่จำเป็น มาตรฐานสากลนี้ระบุความหมายของสตริงตัวอักษร "C" และ "C ++" การใช้สตริงตัวอักษรอื่นที่ไม่ใช่ "C" หรือ "C ++" ได้รับการสนับสนุนแบบมีเงื่อนไขโดยมีซีแมนทิกส์ที่กำหนดใช้งาน [หมายเหตุ: ดังนั้นข้อกำหนดการเชื่อมโยงที่มีสตริงตามตัวอักษรที่ไม่รู้จักในการนำไปใช้จำเป็นต้องมีการวินิจฉัย - หมายเหตุสุดท้าย] [หมายเหตุ: ขอแนะนำให้ใช้การสะกดของสตริงตัวอักษรจากเอกสารที่กำหนดภาษานั้น ตัวอย่างเช่น Ada (ไม่ใช่ ADA) และ Fortran หรือ FORTRAN ขึ้นอยู่กับเหล้าองุ่น - บันทึกท้าย]


1
นี่มาจากไหน
paul

@paul c ++ 11 ร่างมาตรฐาน
aaronman

9

ในหลาย ๆ สภาพแวดล้อม (ส่วนใหญ่) "extern" C "เป็นการประชุมเชื่อมโยงเริ่มต้นสำหรับภาษาใด ๆ ในระบบ

ดังนั้นขึ้นอยู่กับระบบปฏิบัติการและการใช้งานของ "ภาษาต่างประเทศ" "extern C" เป็นสิ่งที่คุณต้องเรียกโปรแกรมในภาษาอื่นที่รวบรวม


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

@ โยฮันเนส: จริง ๆ แล้ว Windows ใช้การประชุม Pascal สำหรับหลาย ๆ สิ่ง แต่เนื่องจากมันต้องการใน C เกินไปและ C ไม่มีextern "Language"ไวยากรณ์ "" พวกเขาทำผ่านส่วนขยาย C เฉพาะแพลตฟอร์มดังนั้นสำหรับ C ++ มันก็แค่extern "C"และพิเศษ คีย์เวิร์ดระบุหลักการเรียกที่แตกต่างกัน
Jan Hudec

1
ยังอาจมีกรณีที่ผู้ขายคอมไพเลอร์เพิ่มประเภทการเชื่อมโยงพิเศษ นอกเหนือจากความสามารถในการทำงานร่วมกับภาษาอื่น ๆ แล้วสิ่งนี้อาจน่าสนใจสำหรับการทำงานร่วมกันกับชื่อ c ++ ที่ต่างกัน คำถามคือว่าใครได้ :)
โยฮันเน


-4
  • No! C ++ สนับสนุน C ในฐานะ "ภาษาลิงก์" เท่านั้น

  • extern "C" {แถบโครงสร้าง {/ * ... * /}}

  • ไวยากรณ์ดังกล่าวข้างต้นหมายความว่าจะไม่เปลี่ยนชื่อของตัวแปร struct หรือฟังก์ชั่น เพราะ C ++ อาจเปลี่ยนชื่อของตัวแปร struct หรือฟังก์ชั่นเพื่อใช้งาน Class, Namespace และฟังก์ชั่นการโอเวอร์โหลด

  • หากคุณไม่ทำเช่นนี้ตัวเชื่อมโยงอาจไม่สามารถค้นหาวัตถุของตัวแปรโครงสร้างของฟังก์ชันได้

  • C ++ ได้รับการออกแบบให้เข้ากันได้กับ C extern "C" เป็นวิธีการใช้งานร่วมกับ C


10
โปรดตรวจสอบ§7.5ของมาตรฐาน C ++ extern "C"และextern "C++"เป็นสิ่งบังคับเฉพาะ แต่การใช้งานจะได้รับอนุญาตให้ผู้อื่น
โยฮันเนส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.