Apa artinya mengekspos kode C ++ secara publik sebagai API C dan apa keuntungan melakukannya?

25

Saya sering mendengar orang mengatakan bahwa programmer C ++ harus mengekspos API publik library / produk mereka sebagai API C.

Apa artinya itu dan apa kelebihannya?

Daniel Ribeiro
sumber

Jawaban:

44

Itu berarti bahwa bagian dari perpustakaan Anda yang diekspos sebagai antarmuka hanya menggunakan "bagian" bahasa C, sehingga Anda tidak mengekspor kelas atau yang serupa, hanya fungsi, POD dan struct yang berisi POD. Plus, Anda harus menonaktifkan mangling nama C ++, biasanya dicapai dengan menandai fungsi sebagai extern "C". Sebuah contoh khas akan:

extern "C" void foo(int bar);

Keuntungan besar dari mengekspos pustaka Anda dengan cara ini adalah bahwa hampir setiap bahasa pemrograman di luar sana memiliki mekanisme untuk berinteraksi langsung dengan pustaka C, tetapi hanya sedikit juga yang dapat berinteraksi langsung dengan pustaka C ++. Jadi dalam arti bahwa, Anda pergi untuk common denominator terendah untuk membuatnya mudah bagi orang lain untuk menggunakan perpustakaan Anda.

Namun perlu diingat bahwa ini benar-benar hanya strategi yang berguna jika Anda membuat perpustakaan untuk dikonsumsi orang lain. Jika Anda sedang membangun bagian dari C ++ - hanya perangkat lunak dan perpustakaan hanya perlu berinteraksi satu sama lain, Anda (IMHO) lebih baik mengekspos C ++ API yang tepat sehingga Anda dapat menggunakan kekuatan penuh dari bahasa.

Timo Geusch
sumber
14
Anda harus berhati-hati untuk tidak mengekspor pengecualian yang dilemparkan juga!
James
Itu jawaban yang bagus. Bisakah Anda memberi saya contoh extern "C"barang yang tidak saya dapatkan?
Daniel Ribeiro
1
@DanielRibeiro: cukup google untuk "extern C". Anda akan menemukan tautan seperti ini: stackoverflow.com/questions/1041866/…
Doc Brown
1
@DanielRibeiro, contoh sangat sederhana ditambahkan.
Timo Geusch
1
@DanielRibeiro Secara teknis masih memungkinkan untuk digunakan .hpp, tetapi ekstensi ini berarti "file header C ++", jadi seharusnya .h, yang digunakan untuk C dan C ++.
leemes
8

Selain jawaban Timo - tidak ada C ++ ABI standar untuk beberapa platform (misalnya Windows - beberapa seperti Linux Mac OS X yang diadopsi secara luas) sehingga tidak hanya masalah fitur yang hilang tetapi juga tidak mungkin mengimplementasikan fitur tersebut.

Sebagai contoh IIRC MSVC memiliki ABI yang berbeda di setiap versi dan itu mungkin berubah tergantung apakah itu debug atau rilis build - dan itu tidak dipublikasikan sehingga kompiler pihak ke-3 biasanya tidak kompatibel (saya membaca beberapa informasi bahwa beberapa versi icc kompatibel dengan MSVC 2005 tetapi mungkin informasi yang diungkapkan di bawah NDA - tidak diperlukan tersedia untuk pencipta katakanlah Python) dan menggunakan ABI mereka sendiri. Jadi dalam praktiknya lingkungan bahasa tidak hanya akan membatasi versi kompiler tetapi juga flag.

Akhirnya C ++ memiliki lebih banyak fitur waktu kompilasi. Misalnya generik biasanya tidak ada dalam bahasa yang diketik secara dinamis, dll.

Maciej Piechotka
sumber
2
@DanielRibeiro: Selamat datang di neraka yang luar biasa dari C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). Versi singkatnya adalah sangat sulit untuk membuat komponen C ++ dikompilasi secara terpisah (dikompilasi dengan kompiler / flag yang berbeda) untuk bekerja bersama, bukannya gagal / crash secara diam-diam.
Maciej Piechotka