موصى به, 2021

اختيار المحرر

الفرق بين مضمن و ماكرو في C ++

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

دعونا دراسة الفرق بين المضمنة والماكرو بمساعدة مخطط المقارنة.

رسم بياني للمقارنة

أساس للمقارنةفي النسقدقيق
الأساسيةيتم تحليل الدوال المضمنة بواسطة المحول البرمجي.يتم توسيع وحدات الماكرو بواسطة المعالج الأولي.
بناء الجملةinline return_type funct_name (parameters) {. . . }#define macro_name char_sequence
الكلمات الرئيسية المستخدمةفي النسق
#حدد
يعرفيمكن تعريفه داخل أو خارج الفصل.يتم تعريفه دائما في بداية البرنامج.
تقييميقوم بتقييم الحجة مرة واحدة فقط.يقوم بتقييم الوسيطة في كل مرة يتم استخدامها في التعليمات البرمجية.
توسيعقد لا محاذاة المحول البرمجي وتوسيع كافة الوظائف.يتم توسيع وحدات الماكرو دائمًا.
التشغيل الآلييتم إجراء الوظائف القصيرة ، المحددة داخل الفئة تلقائيًا على وظائف مضمنة.يجب تعريف وحدات الماكرو على وجه التحديد.
الوصوليمكن لوظيفة عضو مضمن الوصول إلى أعضاء البيانات في الفصل.لا يمكن أن تكون وحدات الماكرو أبدًا أعضاء الفئة ولا يمكن الوصول إلى أعضاء البيانات في الفصل الدراسي.
نهايةينتهي تعريف الدالة المضمنة مع الأقواس المتعرجة في نهاية الدالة المضمنة.تعريف الماكرو ينتهي مع السطر الجديد.
التصحيحالتصحيح سهل لوظيفة مضمنة أثناء إجراء التحقق من الأخطاء أثناء التحويل البرمجي.يصبح التصحيح صعبة لوحدات الماكرو كما لا يحدث تدقيق الأخطاء أثناء التحويل البرمجي.
ربطتربط الدالة المضمنة جميع العبارات في جسم الدالة بشكل جيد حيث يبدأ جسم الدالة وينتهي بالأقواس المتعرجة.يواجه الماكرو مشكلة الربط إذا كان يحتوي على أكثر من جملة واحدة ، لأنه لا يحتوي على رمز إنهاء.

تعريف مضمن

تبدو الدالة المضمنة وكأنها دالة عادية ولكن ، تسبقها الكلمة الرئيسية " inline ". الدالات المضمنة هي دالات طولية قصيرة يتم توسيعها عند نقطة استدعائها ، بدلاً من أن يتم استدعاؤها. دعونا نفهم وظائف مضمنة مع مثال.

 # include using namespace std؛ مثال على class {int a، b؛ public: inlay void initialize (int x، int y) {a = x؛ b = y} void display () {cout << a << "" < 

في البرنامج أعلاه ، أعلنت وتعرفت ، تهيئة الدالة () ، كدالة مضمنة في فئة "مثال". سيتم توسيع كود دالة التهيئة () حيث يتم استدعاؤه بواسطة كائن "مثال" الفئة. عرض الدالة () ، المحدد في مثال الفئة لا يتم تحديده مضمناً ولكن يمكن اعتباره مضمناً بواسطة المحول البرمجي ، كما في C ++ يتم تعريف الدالة التي تم تعريفها داخل الفئة تلقائيًا باستخدام المحول البرمجي مع مراعاة طول الدالة.

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

تعريف ماكرو

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

 #include #define GREATER (a، b) ((a <b)؟ b: a) int main (void) {cout << "Greater of 10 and 20 is" << GREATER ("20"، "10") << "\ n" ؛ العودة 0 ؛ } 

في التعليمات البرمجية أعلاه ، أعلنت وظيفة ماكرو GREATER () ، والتي تقارن وتجد العدد الأكبر لكل من المعلمات. يمكنك ملاحظة أنه لا يوجد فاصلة منقوطة لإنهاء الماكرو كما يتم إنهاء الماكرو فقط بواسطة السطر الجديد. وبما أن الماكرو هو مجرد بديل للنص ، فسوف يقوم بتوسيع رمز الماكرو حيث يتم استدعاؤه.

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

الاختلافات الأساسية بين سطري و ماكرو

  1. الفرق الأساسي بين المضمنة والماكرو هو أن يتم تحليل الدالات المضمّنة بواسطة المحول البرمجي بينما يتم توسيع وحدات الماكرو في أحد البرامج بواسطة preprocessor.
  2. الكلمة الأساسية المستخدمة لتعريف دالة مضمنة هي " مضمنة " بينما الكلمة الأساسية المستخدمة لتعريف ماكرو هي " #define ".
  3. بمجرد أن تكون الدالة المضمنة decalre داخل فئة ، يمكن تعريفها إما داخل فئة أو خارج الفصل الدراسي. من ناحية أخرى ، يتم تعريف الماكرو دائمًا في بداية البرنامج.
  4. يتم تمرير الوسيطة التي تم تمريرها إلى الدالات المضمنة مرة واحدة فقط أثناء التحويل البرمجي بينما يتم تقييم وسيطة الماكرو في كل مرة يتم فيها استخدام الماكرو في التعليمات البرمجية.
  5. المحول البرمجي قد لا يتم تضمين كافة الوظائف المحددة داخل فئة وتوسيعها. من ناحية أخرى ، يتم توسيع وحدات الماكرو دائمًا.
  6. يتم إنشاء الدالة القصيرة التي تم تعريفها داخل فئة دون الكلمة الأساسية المضمنة تلقائياً وظائف مضمنة. من ناحية أخرى ، يجب تعريف الماكرو على وجه التحديد.
  7. يمكن لوظيفة مضمن الوصول إلى أعضاء الفئة بينما لا يمكن لماكرو الوصول أبدًا إلى أعضاء الفئة.
  8. لإنهاء وظيفة مضمنة مطلوب قوس مغلق مجعد بينما ، يتم إنهاء ماكرو مع بداية سطر جديد.
  9. وتصبح عملية التصحيح سهلة بالنسبة لوظيفة inlne حيث يتم التحقق منها أثناء التحويل البرمجي لأي خطأ. من ناحية أخرى ، لا يتم التحقق من الماكرو أثناء التحويل البرمجي لذلك ، يصبح من الصعب تصحيح أخطاء الماكرو.
  10. وكونها دالة ، فإن وظيفة مضمنة تربط بين أعضائها داخل أقواس بداية و مغلقة مجعدة. من ناحية أخرى ، لا يحتوي الماكرو على أي رمز إنهاء ، لذا يصبح الربط أمرًا صعبًا عندما يحتوي الماكرو على أكثر من عبارات واحدة.

الاستنتاجات:

وظائف مضمنة مقنعة أكثر بكثير من وظيفة الماكرو. يوفر C ++ أيضًا طريقة أفضل لتعريف ثابت ، والذي يستخدم الكلمة الأساسية "const".

Top