0Pricing
C++ Academy · درس

‏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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏extern C وواجهة C ABI
  2. استدعاء Python من C++ عبر pybind11
  3. حدود FFI بين C++ وRust
  4. استخدام SWIG للروابط متعددة اللغات
← العودة إلى C++ Academy