سؤال

لدعم منصات متعددة في C / C ++، واحد استخدام المعالج لتمكين بتجميع المشروطة. منها مثلا.

#ifdef _WIN32
  #include <windows.h>
#endif

وكيف يمكنك أن تفعل هذا في ادا؟ هل لادا قبل المعالج؟

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

المحلول

والجواب على سؤالك هو لا، ادا لم يكن لديك ما قبل المعالج المضمن في اللغة. وهذا يعني يجوز لكل مترجم أو قد لا يكون واحد وليس هناك "موحدة" في بناء الجملة لمرحلة ما قبل المعالجة وأشياء مثل الترجمة الشرطية. كان هذا مقصودا: انها تعتبر "ضارة" لروح ادا

.

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

وكل ما يقال، GNAT أدرك أنه في بعض الأحيان كنت في حاجة الى المعالج وخلقت gnatprep. يجب أن تعمل بغض النظر عن المترجم (ولكن سوف تحتاج إلى أدخله في عملية الإنشاء الخاصة بك). وبالمثل، لأشياء بسيطة (مثل الترجمة الشرطية) ربما يمكنك فقط استخدام ج قبل المعالج أو حتى لفة الخاص بك واحد بسيط جدا.

نصائح أخرى

يوفر

gnatprep المعالج، وهي متخصصة ل ادا. فذكرت أن gnatprep "لا تعتمد على أي ميزات GNAT الخاصة"، لذلك يبدو كما لو أنه ينبغي أن تعمل مع المجمعين غير GNAT أدا. يوفر لهم دليل المستخدم أيضا بعض مشروط تجميع المشورة .

ولقد كنت على مشروع حيث تم استخدام M4 كذلك، مع المواصفات وهيئة ملفات ادا suffixed باسم ".m4s" و ".m4b"، على التوالي.

وأفضله هو في الحقيقة لتجنب تجهيزها تماما، ومجرد استخدام الهيئات المتخصصة، وإقامة CM وعملية الإنشاء لإدارتها.

ولكن لا المعالج CPP أو M4 يمكن أن يطلق على أي ملف على سطر الأوامر أو باستخدام أداة البناء مثل حياة أو النمل. أقترح دعوتكم .ada ملف شيء آخر. وقد فعلت ذلك لبعض الوقت على ملفات جافا. أسميه .m4 ملف جافا وتستخدم قاعدة جعل لإنشاء. JAVA ثم نبني عليه بالطريقة العادية.

وآمل أن يساعد.

وبعض المجمعين في عهد Ada1983 القدامى لديهم حزمة تسمى a.app التي تستخدم ل# -prefixed فرعية من آدا (تفسير في بناء الوقت) كلغة تجهيزها لتوليد ادا (أن ترجم بعد ذلك إلى رمز الجهاز في compile- زمن). تطوير نظام عقلاني في Verdix ادا (VADS) يبدو أن السلف من a.app بين العديد من المجمعين أدا. صن مايكروسيستمز، على سبيل المثال، اشتقاق ادا SPARCompiler من VADS وبالتالي كان أيضا a.app. هذه ليست خلافا للاستخدام PL / I مثل المعالج من PL / I، الذي لم IBM.

والفصل 2 هو بعض الوثائق ما a.app تبدو مثل: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

نعم، لديه.

إذا كنت تستخدم مترجم GNAT، يمكنك استخدام gnatprep لفعل تجهيزها، أو إذا كنت تستخدم GNAT البرمجة ستوديو يمكنك تكوين ملف المشروع إلى تحديد بعض مفاتيح الترجمة الشرطية مثل

#if SOMESWITCH then
-- Your code here is executed only if the switch SOMESWITCH is active in your build configuration
#end if;

في هذه الحالة يمكنك استخدام gnatmake أو gprbuild لذلك لم يكن لديك لتشغيل gnatprep باليد.

وهذا مفيد جدا، على سبيل المثال، عندما تحتاج إلى ترجمة نفس رمز لعدة مختلفة من نظام التشغيل باستخدام مختلفة حتى عبر المجمعين.

لا، لا.

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

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

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

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