Saya sering mendengar orang mengatakan bahwa programmer C ++ harus mengekspos API publik library / produk mereka sebagai API C.
Apa artinya itu dan apa kelebihannya?
Saya sering mendengar orang mengatakan bahwa programmer C ++ harus mengekspos API publik library / produk mereka sebagai API C.
Apa artinya itu dan apa kelebihannya?
Jawaban:
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.
extern "C"
barang yang tidak saya dapatkan?
.hpp
, tetapi ekstensi ini berarti "file header C ++", jadi seharusnya .h
, yang digunakan untuk C dan C ++.
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.