سؤال

هل يمكن أن استدعاء وظائف C ++ من آدا؟

وأنا أتساءل عما إذا كان هناك طريقة للقيام بذلك مباشرة، دون أن تفعل التنفيذ في C و C ++ كتابة المجمع ووادا المجمع، على سبيل المثال وأود أن أذهب ج ++ -> ادا بدلا من ج ++ -> ج -> ادا

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

المحلول

والمشكلة مع ادا لC ++ هي أن C ++ لايوجد ABI محددة.
ويسمح لكل مترجم لتحديد ABI effecient معظم ما في وسعها.

وهكذا تفاعل من لغات أخرى (ادا) هو الألم كما كنت في حاجة مترجم آدا لمعرفة أي المترجم تم تصنيف C ++ مع قبل أن تولد رمز الصحيح لاستدعاء أي C ++ طريقة / وظيفة.

ومن ناحية أخرى C ABI يعرف جيدا مستوى في جميع المجمعات وعلى هذا النحو يوفر واجهة مريحة لطيفة لأي لغة للتواصل مع.

نصائح أخرى

والجواب فقط حقا مترجم الملحد وأستطيع أن أعطي لكم هو أنه مجرد وقت ممكن وصفه C ++ C من على نظامك.

ويشبه إلى حد كبير مع C، لديك لمعرفة رمز روتين لديك C ++-المهترئ اسم وكتابة ملزمة للC (في هذه الحالة ادا) الجانب الذي يربط لهذا الاسم المهترئ. هل من المحتمل أيضا أن تفعل بعض الأشياء على الجانب C ++، مثل إعلان C ++ وظيفة خارجي.

إذا أن نعلن لكم C ++ وظيفة خارجي "C"، فإنه من السهل. فقط تفعل ذلك على الجانب C ++، واستخدام ميزات C استيراد القياسية آدا على الجانب أدا.

مثال:

وفي حزب الشعب الكمبودي الخاص بك:

extern "C" int cpp_func (int p1, int p2) {
   ; // Whatever..
}

وفي .adb الخاص بك:

function cpp_func (p1, p2 : Interfaces.C.Int) return Interfaces.C.Int;
pragma Import (C, cpp_func); 

...
Result : constant Interfaces.C.Int := cpp_func (1, 2);

وكنت قد تكون مهتمة في هذه الورقة، التي تناقش على مستوى كائن ملزم من آدا إلى C ++:

http://www.adacore.com/uploads/technical-papers /Class_level_interfacing.pdf

وأيضا، الإصدار الأخير من GNAT ميزة مولد ملزم التلقائي قوية.

ولا يبدو ممكنا ...

هنا

و"واجهة المباشرة إلى C ++ من آدا هي خارج نطاق ادا (95 على الأقل)"

وجرعة كبيرة قد تكون قادرة على القيام بذلك

وأنا لم تطرق ادا منذ 99/00 حتى ذاكرتي قد تكون سطحية بعض الشيء ولكن عندما كنا نعمل على التطبيق النوافذ الرسومية في ادا كنا بحاجة إلى القيام ببعض الاشياء في C ++ (غير مهمة حاسمة) والطريقة التي وأدرجت اثنين لديها ج ++ الاشياء في دلل (الصورة) ثم قم بإنشاء المجمع C إلى أن DLL ثم استخدام واجهة PRAGMA التي حددت المجمع ج ومن ثم يمكن أن نسميه الطرق داخل دلل من تلك الواجهة.

وأعتقد أنه وصلت إلى بعض الصيانة ثلاثية لأن التوقيعات أسلوب كان لا بد من تحديثها في واجهة PRAGMA والمجمع C إذا غيروا في ج ++ دلل.

وأساسا كان الألم. وأعتقد أننا قد لاستخدام Win32 والعجاف ويعني توجيه precomplier في المجمع C.

وعلى أي حال، هذا هو كل ثلاثة منا الذين عملوا على المشروع أن أتذكر.

وجرين هيلز البرمجيات نشر PDF العظيم في هذا أيضا.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

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