C ++ Bahasa Tautan selain C?

25

Bahasa C ++ memungkinkan pencampuran kedua C ++ dan C dalam satu file sumber. Sebagai contoh,

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

Apakah C ++ atau pernahkah ia mendukung "bahasa tautan" lainnya selain C? misalnya extern "Pascal"atauextern "Haskell"

dkaranovich
sumber
sebagian besar waktu kedua bahasa akan melakukan yang extern "C"setara untuk berinteraksi satu sama lain
ratchet freak
C ++ mendukung tautan lain dengan memungkinkan imlementasi untuk menambahkan jenis tautannya (§7.5), pertanyaannya adalah "Apakah ada implementasi atau ada implementasinya" ;-)
johannes
2
extern "C"hanya memengaruhi pertautan, bukan sintaks dan semantik teks di dalam blok. Dengan kata lain, itu masih C ++ di dalam extern "C"blok itu; nama simbol tidak hancur. Lihat stackoverflow.com/q/1041866/712605
Richard Hansen

Jawaban:

17

extern "C" mungkin satu-satunya yang diperlukan:

Setiap implementasi harus menyediakan tautan ke fungsi yang ditulis dalam bahasa pemrograman C, "C", dan tautan ke fungsi C ++, "C ++".

Namun orang lain dapat ada sesuai kutipan ini:

String-literal menunjukkan hubungan bahasa yang diperlukan. Standar Internasional ini menetapkan semantik untuk string-literal "C" dan "C ++". Penggunaan string-literal selain "C" atau "C ++" didukung oleh kondisi, dengan semantik yang ditentukan implementasi. [Catatan: Oleh karena itu, spesifikasi-hubungan dengan string-literal yang tidak diketahui untuk implementasi memerlukan diagnostik. - catatan akhir] [Catatan: Dianjurkan agar ejaan string-literal diambil dari dokumen yang mendefinisikan bahasa itu. Misalnya, Ada (bukan ADA) dan Fortran atau FORTRAN, tergantung pada vintage. - catatan akhir]

Harun
sumber
1
Dari mana ini dikutip?
paul
@ paul c ++ 11 draft standar
aaronman
9

Dalam banyak (sebagian besar) lingkungan "extern" C "adalah konvensi penautan default untuk semua bahasa pada sistem.

Jadi tergantung pada sistem operasi dan implementasi bahasa "asing" "extern C" adalah semua yang Anda butuhkan untuk memanggil program dalam bahasa kompilasi lain.

James Anderson
sumber
Bahkan lingkungan yang tidak menggunakan tautan C (Pascal yaitu sering menggunakan urutan argumen lain pada stack dan callee harus membebaskan nilai) mereka memiliki mode yang kompatibel dengan C
johannes
@johannes: Sebenarnya Windows menggunakan konvensi Pascal untuk banyak hal, tetapi karena perlu bahwa di C juga dan C tidak memiliki " extern "Language"" sintaks, mereka melakukannya melalui ekstensi C platform-spesifik, jadi untuk C ++ itu masih hanya extern "C"dan khusus kata kunci menentukan konvensi panggilan yang berbeda.
Jan Hudec
1
Masih mungkin ada kasus di mana vendor kompiler menambahkan jenis tautan khusus. Selain interoperabilitas dengan bahasa lain, ini mungkin juga menarik untuk interoperabilitas dengan berbagai pencatatan nama C ++. Pertanyaannya adalah apakah ada yang melakukannya :)
johannes
-4
  • Tidak! C ++ hanya mendukung C sebagai "bahasa tautan".

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

  • Sintaks seperti di atas berarti bahwa tidak mengubah nama variabel, struct atau fungsi. Karena C ++ mungkin mengubah nama variabel, struct atau fungsi untuk mengimplementasikan Class, Namespace dan fungsi overloading.

  • Jika Anda tidak melakukan ini, penghubung mungkin tidak dapat menemukan objek variabel, struct fungsi.

  • C ++ dirancang agar kompatibel dengan C. Eksternal "C" adalah cara untuk mengimplementasikan yang kompatibel dengan C.

Edward Shen
sumber
10
Silakan periksa §7.5 dari standar C ++. extern "C"dan extern "C++"satu-satunya yang wajib, tetapi implementasi diizinkan untuk menyediakan yang lain.
johannes