باستخدام مكتبة مكتوبة بلغة C مع C ++

1

أحاول تضمين خادم الويب النمس ، والذي هو مكتوب بلغة C ، وكتابة بقية التعليمات البرمجية في C ++. عند الترجمة أحصل على الخطأ: إعادة تعريف نوع C ++ المضمن 'bool' في ملف رأس النمس في كتل الكود

#include <iostream>
#include "mongoose.h"

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

أرفقت رأس النمس في

#ifdef __cplusplus
    extern "C"{
#endif 
// header content
#ifdef __cplusplus
    }
#endif

وما زلت أتلقى نفس الخطأ في #include winsock2.h

2 الاجابة

2
افضل جواب

C و C ++ هي لغات مختلفة تشترك في مجموعة فرعية مشتركة. يمكنك تجميع معظم تعريفات C باستخدام مترجم C ++ عن طريق وضعها في قسم يحدد ارتباط C ، كما تظهر ، ولكن هذا يتبع من اللغة الفرعية لتصريحات C التي تكون تقريبًا بالكامل ضمن المجموعة الفرعية المشتركة لـ C و C ++.

يحتوي C ++ على ميزات تعريفية وقيود أكثر من C ، على أي حال. على وجه الخصوص ، حقيقة أنه يوفر bool حيث أن النوع المضمن يضع قيدًا لا يمكن إعادة تعريف هذا المعرف كاسم مطبوع. من ناحية أخرى ، يحتوي C على رأس قياسي يحدد بالضبط مثل هذا النوع من المطبوعات ، وليس من غير المألوف أن يتدحرج الأشخاص أيضًا. سيتم رفض هذه الحروف المطبوعة من قبل مترجم C ++ ، على الرغم من ارتباط C.

إذا لم يتم إنشاء مشروع C بالفعل مع مراعاة توفير الاستخدام من قبل برامج C ++ ، وببساطة لا يكفي التفاف تضمين الرأس في كتلة ارتباط C ، فلا يمكنك ببساطة استخدام رأس تلك المكتبة كما هو. خياراتك إما تعديلها أو تقديم بديل. قد تحتاج أيضًا إلى توفير بعض وظائف الغلاف ، مكتوبة بلغة C ، لتكون واجهة مع برنامج C ++ الخاص بك. تعتمد التفاصيل على المكتبة التي تحاول استخدامها.

:مؤلف
0

إذا كانت هذه هي مشكلتك الوحيدة ، فيمكنك إضافة #define bool C_INT_BOOL بالقرب منك extern "C" ، ثم #undef bool بالقرب من }
في ملف cpp الخاص بك أود أن أكتب:

extern "C"{
#define bool C_INT_BOOL
#include "mongoose.h"
#undef bool
}

يسمح هذا للواجهة "C" برؤية نوع المعلمة int ، ولكن لا يجب أن يتداخل مع استخدام c ++ الخاص بك bool.

ولكن أشك في أن هذه ستكون مشكلتك الوحيدة ، وفي هذه الحالة ستدرك بسرعة أن إضافة طبقة وظيفة واجهة هي الطريقة الأكثر أمانًا للذهاب.

:مؤلف
فوق
قائمة طعام