شرح مفصل لملفات الرأس وملفات المصدر في C ++
1. وضع تجميع C ++
بشكل عام ، في برنامج C ++ ، لا يوجد سوى نوعان من الملفات - ملف .cpp وملف .h. من بينها ، يسمى ملف .CPP ملف مصدر C ++ ، ويتم وضع رمز المصدر لـ C ++ فيه ؛ بينما يسمى ملف .H ملف رأس C ++ ، ويتم وضع رمز المصدر لـ C ++ فيه.
تدعم لغة C ++ "تجميع منفصل". بمعنى آخر ، يمكن تقسيم جميع محتويات البرنامج إلى أجزاء مختلفة ووضعها في ملفات .CPP مختلفة. الأشياء في ملف .cpp مستقل نسبيا. عند التجميع (تجميع) ، لا تحتاج إلى التواصل مع الملفات الأخرى. تحتاج فقط إلى الارتباط مع الملفات المستهدفة الأخرى بعد تجميعها في الملف الهدف. على سبيل المثال ، يتم تعريف الدالة العالمية "void a () {}" في الملف A.CPP ، ويجب استدعاء هذه الوظيفة في الملف B.CPP. ومع ذلك ، فإن الملفات A.CPP و B.CPP لا تحتاج إلى معرفة وجود بعضهما البعض ، ولكن يمكنها تجميعها بشكل منفصل. بعد تجميعها في الملف المستهدف ، ربطها ، ويمكن تشغيل البرنامج بأكمله.
كيف يتم تحقيق هذا؟ من منظور كتابة البرامج ، يكون الأمر بسيطًا للغاية. في الملف B.CPP ، قبل استدعاء وظيفة "void a ()" ، أعلن الوظيفة "void a () ؛" أولاً. وذلك لأن المترجم سيقوم بإنشاء جدول رمز عند تجميع B.CPP. سيتم تخزين رموز مثل "void a ()" التي لا يمكن رؤيتها في هذا الجدول. عند الارتباط مرة أخرى ، سيبحث المترجم عن تعريف هذا الرمز في ملفات الكائنات الأخرى. بمجرد العثور عليها ، يمكن إنشاء البرنامج بسلاسة.
لاحظ أن هناك مفهومين مذكوران هنا ، أحدهما "تعريف" والآخر هو "إعلان". ببساطة ، "التعريف" يعني وصف الرمز بطريقة كاملة وكاملة: سواء كان متغيرًا أو وظيفة ، ما هو النوع الذي يعيده ، وما هي المعلمات التي يحتاجها ، إلخ. "الإعلان" يعلن عن وجود هذا الرمز ، أي ، يخبر المترجم بأن هذا الرمز محدد في ملفات أخرى. سأستخدمها أولاً. عند الارتباط ، انتقل إلى مكان آخر لمعرفة ما هو عليه. عند التعريف ، يجب عليك تحديد رمز (متغير أو وظيفة) تمامًا وفقًا لبناء C ++ ، وعند الإعلان ، تحتاج فقط إلى كتابة النموذج الأولي لهذا الرمز. تجدر الإشارة إلى أنه يمكن إعلان الرمز عدة مرات خلال البرنامج ، ولكن يجب تعريفه مرة واحدة فقط. فقط تخيل ، إذا كان هناك تعريفان مختلفان للرمز ، فمن يجب أن يستمع المترجم؟
تجلب هذه الآلية العديد من الفوائد لمبرمجي C ++ ، وتؤدي أيضًا إلى طريقة لكتابة البرامج. ضع في اعتبارك أنه إذا كانت هناك وظيفة شائعة الاستخدام "void f () {}" سيتم استدعاؤها في العديد من ملفات .cpp في البرنامج بأكمله ، فحيننا فقط بحاجة إلى تحديد هذه الوظيفة في ملف واحد وإعلان هذه الوظيفة في ملفات أخرى. من السهل التعامل مع الوظيفة ، وهذا يعني فقط جملة واحدة لإعلانها. ومع ذلك ، ماذا لو كان هناك الكثير من الوظائف ، مثل مجموعة من الوظائف الرياضية ، هناك المئات منها؟ هل يمكن لكل مبرمج أن يتأكد بدقة وتكتب جميع الوظائف في شكلها؟
2. ما هو ملف الرأس
من الواضح أن الجواب مستحيل. ولكن هناك طريقة بسيطة للغاية لمساعدة المبرمجين على حفظ مشكلة في تذكر العديد من النماذج الأولية للوظائف: يمكننا كتابة جميع بيانات الإعلان لمئات الوظائف أولاً ووضعها في ملف. عندما يحتاج المبرمج إليهم ، انسخ كل هذه الأشياء في رمز المصدر الخاص به.