Extern C dan ABI C
Sediakan interface yang kompatibel dengan C dari pustaka C++ menggunakan extern C
Extern C dan ABI C adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Mengapa Interoperabilitas?
C++ memiliki ABI yang kompleks (Application Binary Interface) dengan pengacakan nama, pengecualian, dan templat. Bahasa lain (C, Python, Rust) tidak dapat menggunakan simbol C++ yang namanya diacak secara langsung.
extern "C"
Bungkus deklarasi dalam extern "C" untuk menonaktifkan pengacakan nama C++ dan menggunakan konvensi pemanggilan C.
extern "C" {
void greet(const char* name);
int add(int a, int b);
}Mengapa ABI C?
ABI C adalah penyebut umum terendah di antara berbagai bahasa. Hampir setiap bahasa dapat memanggil fungsi C melalui FFI.
Pola File Header
Buat header yang dapat digunakan dari C dan C++ dengan extern "C" bersyarat.
#ifdef __cplusplus
extern "C" {
#endif
void hello(void);
int sum(int a, int b);
#ifdef __cplusplus
}
#endifHal yang Tidak Dapat Anda Ekspor
Beberapa fitur C++ tidak memiliki padanan dalam C:
- Kelas (tidak ada konsep kelas dalam C)
- Templat (diselesaikan saat kompilasi dan tidak dapat diekspor)
- Fungsi berlebih (tanpa pengacakan nama, tidak ada fungsi berlebih)
- Pengecualian (harus ditangkap sebelum melewati FFI)
Mengekspos Kelas
Sembunyikan kelas di balik penunjuk buram dan API bergaya C.
// header (C visible)
typedef struct Widget Widget;
Widget* widget_create(int x);
void widget_destroy(Widget*);
int widget_value(const Widget*);
// .cpp
class WidgetImpl { /* ... */ };
extern "C" {
Widget* widget_create(int x) { return reinterpret_cast<Widget*>(new WidgetImpl(x)); }
void widget_destroy(Widget* w) { delete reinterpret_cast<WidgetImpl*>(w); }
}Hindari Pengecualian Melintasi FFI
Pengecualian yang dilemparkan dari fungsi C++ yang dipanggil melalui C akan menghentikan program. Tangkap pengecualian tersebut di batas.
extern "C" int safe_call() {
try {
risky();
return 0;
} catch (...) {
return -1;
}
}Kepemilikan Memori
Dokumentasikan siapa yang memiliki apa — biasanya pihak yang melakukan alokasi juga melakukan pembebasan. Ketidaksesuaian menyebabkan kebocoran atau pembebasan ganda.
String Melintasi FFI
std::string hanya untuk C++. Lintaskan melalui FFI sebagai const char*. Tentukan apakah penerima menyalinnya, dan dokumentasikan masa hidupnya.
Struct Melintasi FFI
Gunakan struct POD (data lama biasa) yang memiliki tata letak sama dalam C dan C++. Hindari fungsi virtual, referensi, atau tipe dari std.
Panggilan Balik
Teruskan penunjuk fungsi (atau void* + penunjuk fungsi) melalui FFI. Sediakan penunjuk konteks untuk closure.
extern "C" {
typedef void (*Callback)(int value, void* user_data);
void register_callback(Callback cb, void* user_data);
}Linkage dan Header
extern "C" hanya memengaruhi linkage, bukan perilaku. Fungsi tersebut tetap dikompilasi sebagai C++ di dalam, tetapi dapat dipanggil sebagai C dari luar.
Pemeriksaan Singkat
Mengapa fungsi C++ dibungkus dalam extern "C" saat diekspos ke bahasa lain?
Ringkasan
extern "C" memberikan linkage C pada fungsi — tanpa pengacakan nama dan dengan konvensi pemanggilan C. Gunakan ini untuk mengekspos C++ ke bahasa lain melalui FFI. Sembunyikan kelas di balik penunjuk buram, tangkap pengecualian di batas, dan dokumentasikan kepemilikan dengan jelas.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Extern C dan ABI C” gratis?
Ya — teks lengkap “Extern C dan ABI C” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Extern C dan ABI C”?
Sediakan interface yang kompatibel dengan C dari pustaka C++ menggunakan extern C Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Extern C dan ABI C” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Extern C dan ABI C
- Memanggil Python dari C++ melalui pybind11
- C++ untuk Batas FFI Rust
- Menggunakan SWIG untuk Binding Multibahasa