extern C وواجهة C ABI
وفّر واجهات متوافقة مع C من مكتبات C++ باستخدام extern C.
extern C وواجهة C ABI درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
لماذا التشغيل البيني؟
تتميز C++ بواجهة تطبيق ثنائية (ABI) معقدة تتضمن تشويه الأسماء والاستثناءات والقوالب. ولا تستطيع اللغات الأخرى (C وPython وRust) استهلاك رموز C++ المشوهة مباشرةً.
extern "C"
غلّف التصريحات داخل extern "C" لتعطيل تشويه أسماء C++ واستخدام اصطلاح استدعاء C.
extern "C" {
void greet(const char* name);
int add(int a, int b);
}لماذا ABI الخاصة بـ C؟
تُعد ABI الخاصة بـ C القاسم المشترك الأدنى بين اللغات. ويمكن لجميع اللغات تقريبًا استدعاء دوال C عبر FFI.
نمط ملف الترويسة
اجعل الترويسة قابلة للاستخدام من C وC++ مع استخدام شرطي لـ extern "C".
#ifdef __cplusplus
extern "C" {
#endif
void hello(void);
int sum(int a, int b);
#ifdef __cplusplus
}
#endifما لا يمكنك تصديره
لا تملك بعض ميزات C++ مكافئًا في C:
- الأصناف (لا يوجد مفهوم الصنف في C)
- القوالب (تُحل في وقت الترجمة ولا يمكن تصديرها)
- الدوال متعددة التحميل (لا يوجد تعدد تحميل دون تشويه الأسماء)
- الاستثناءات (يجب التقاطها قبل عبور FFI)
كشف صنف
أخفِ الصنف خلف مؤشرات معتمة وواجهة برمجية على نمط 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); }
}تجنب الاستثناءات عبر FFI
سيؤدي إطلاق استثناء من دالة C++ مستدعاة عبر C إلى إيقاف البرنامج. التقط الاستثناءات عند الحد الفاصل.
extern "C" int safe_call() {
try {
risky();
return 0;
} catch (...) {
return -1;
}
}ملكية الذاكرة
وثّق الجهة المالكة لكل شيء — فعادةً ما تكون الجهة التي تخصص الذاكرة هي التي تحررها. وتؤدي حالات عدم التطابق إلى تسرّبات أو عمليات تحرير مزدوجة.
السلاسل النصية عبر FFI
إن std::string خاص بـ C++ فقط. اعبر FFI باستخدام const char*. حدّد ما إذا كان الطرف المستقبل سينسخ البيانات، ووثّق مدة حياتها.
البنى عبر FFI
استخدم بنى POD (بيانات قديمة بسيطة) لها التخطيط نفسه في C وC++. وتجنب الدوال الافتراضية والمراجع وأنواع std.
الاستدعاءات العكسية
مرّر مؤشرات الدوال (أو void* مع مؤشر دالة) عبر FFI. ووفّر مؤشر سياق للإغلاقات.
extern "C" {
typedef void (*Callback)(int value, void* user_data);
void register_callback(Callback cb, void* user_data);
}الربط والترويسات
يؤثر extern "C" في الربط فقط، وليس في السلوك. فما تزال الدالة تُترجم بصفتها C++ من الداخل، لكنها قابلة للاستدعاء بصفتها C من الخارج.
تحقق سريع
لماذا نغلّف دوال C++ داخل extern "C" عند كشفها للغات أخرى؟
خلاصة
يمنح extern "C" الدالةَ ربطًا خاصًا بـ C — دون تشويه للأسماء، وباستخدام اصطلاح استدعاء C. استخدمه لكشف C++ للغات الأخرى عبر FFI. وأخفِ الأصناف خلف مؤشرات معتمة، والتقط الاستثناءات عند الحد الفاصل، ووثّق الملكية بوضوح.
الأسئلة الشائعة
هل درس «extern C وواجهة C ABI» مجاني؟
نعم — نص درس «extern C وواجهة C ABI» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «extern C وواجهة C ABI»؟
وفّر واجهات متوافقة مع C من مكتبات C++ باستخدام extern C. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «extern C وواجهة C ABI»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- extern C وواجهة C ABI
- استدعاء Python من C++ عبر pybind11
- حدود FFI بين C++ وRust
- استخدام SWIG للروابط متعددة اللغات