التواصل مع stdbool.h C++
سؤال
في أحد المشاريع، أقوم بالربط بين 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 بدلاً من ذلك.