سؤال

في أحد المشاريع، أقوم بالربط بين C++ ومكتبة C التي تستخدم stdbool.h المعرفة على هذا النحو.

#ifndef _STDBOOL_H
#define _STDBOOL_H

/* C99 Boolean types for compilers without C99 support */
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */
#if !defined(__cplusplus)

#if !defined(__GNUC__)
/* _Bool builtin type is included in GCC */
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
#endif

#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1

#endif

#endif

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

هل لدى أي شخص أي نصيحة حول كيفية التغلب على هذا دون اللجوء إلى الحل الحالي وهو

//#define bool _Bool
#define bool unsigned char

وهو مخالف لمعيار C99 لـ stdbool.h

هل كانت مفيدة؟

المحلول

لقد وجدت الإجابة على سؤالي من خلال إيجاد تطبيق أكثر توافقًا لـ stdbool.h المتوافق مع معيار C99.

#ifndef _STDBOOL_H
#define _STDBOOL_H

#include <stdint.h>

/* C99 Boolean types for compilers without C99 support */
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */
#if !defined(__cplusplus)

#if !defined(__GNUC__)
/* _Bool builtin type is included in GCC */
/* ISO C Standard: 5.2.5 An object declared as 
type _Bool is large enough to store 
the values 0 and 1. */
/* We choose 8 bit to match C++ */
/* It must also promote to integer */
typedef int8_t _Bool;
#endif

/* ISO C Standard: 7.16 Boolean type */
#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1

#endif

#endif

وهذا مأخوذ من مكتبة فئة آدا مشروع.

نصائح أخرى

الحجم ليس هو الشيء الوحيد الذي سيكون غير متناسق هنا.في لغة C++، تعد كلمة bool كلمة أساسية، ويضمن C++ أن المنطقية يمكن أن تحتوي على قيمة إما 1 أو 0 ولا شيء آخر.C لا يمنحك هذا الضمان.

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

منطقيًا، لا يمكنك مشاركة التعليمات البرمجية المصدر بين C وC++ مع إعلانات متعارضة لـ bool وجعلها مرتبطة ببعضها البعض.

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

union boolean {
   bool value_cpp;
   int  value_c;
}; 

// قد تكون الحشوة ضرورية اعتمادًا على endianness

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

لذا، ما عليك فعله بدلاً من ذلك هو إنشاء ملف الرقائق بين برنامج C++ ومكتبة C.

لديك:

extern "C" bool library_func_1(int i, char c, bool b);

وتحتاج إلى إنشاء:

bool library_func_1_cpp(int i, char c, bool b)
{
   int result = library_func_1(i, c, static_cast<int>(b));
   return (result==true);
}

والآن اتصل بمكتبة Library_func_1_cpp بدلاً من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top